通過測試,UTF-8 一個漢字3字節,GB2312一個漢字佔2字節,每個字節大小都大於127。
128的ACSII是0111 1111 127 7F DEL (delete) 刪除
根據以上規則:根據索引找到對應字節,再替換就行了。
按此方法,可以進行任意編碼轉換。
char str[]={0XE7,0X9B,0X91,}; //監 UTF-8
char str[]={0XBC,0XE0,}; //監 GB2312
C語言示例測試源碼(注意:當前代碼編輯器爲UTF-8)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//str刪除所有字符,只要漢字
void delete_char_xiaoyu(char str[],unsigned char target)
{
int i,j;
for(i=j=0;str[i]!='\0';i++){
if((unsigned char)str[i]>=target){
str[j++]=str[i];
}
//printf("%d,%d,%02X,%02X\n",i,j,(unsigned char)str[i],(unsigned char)str[j]);
}
str[j]='\0';
}
//漢字UTF-8通過索引數組轉爲GB2312,沒有就跳過
void transUTF8toGB2312(char *strUTF8)
{
//index中本代碼是UTF-8 一個漢字3字節
//indexGB2312對應index的GB2312字節數組。 一個漢字2字節 ,index和indexGB2312一定要根據漢字變動來加,可以多不能少。
char indexUTF8[]={"監測點溫度"};
char indexGB2312[]={0XBC,0XE0,0XB2,0XE2,0XB5,0XE3,0XCE,0XC2,0XB6,0XC8,}; //監測點溫度
int i,j,k;
for (i = j = 0; (char)strUTF8[i] != '\0'; )
{
if((unsigned char)strUTF8[i] >= 128) //查找所有漢字
{
for (k = 0; k<strlen(indexUTF8); k=k+3) //在索引中查找
{
if((unsigned char)strUTF8[i]==(unsigned char)indexUTF8[k] && (unsigned char)strUTF8[i+1]==(unsigned char)indexUTF8[k+1] && (unsigned char)strUTF8[i+2]==(unsigned char)indexUTF8[k+2] ) //找到索引
{
//printf("k=%d\n",k);
strUTF8[j++] = indexGB2312[k/3*2];
strUTF8[j++] = indexGB2312[k/3*2+1];
i++; //跳過一個漢字
i++;
i++;
break;
}
}
if(k>=strlen(indexUTF8)) //沒有找到,就提示加上索引
{
char temp[4]={0};
memcpy(temp,strUTF8+i,3);
printf("ERROR,請加上索引[%s]\n",temp);
i++; //跳過一個漢字
i++;
i++;
}
}
else //非漢字
{
strUTF8[j++] = strUTF8[i];
i++; //跳過一個字符
}
}
strUTF8[j] = '\0';
}
//
int main()
{
int i=0;
char str[200]="監測點#0;\n土壤PH\n:;0.0";
delete_char_xiaoyu(str,128);
printf("去掉所有字符:%s\n",str);
return 0;
}
Java編碼生成源碼
import java.io.UnsupportedEncodingException;
public class GB2312toByteArray {
static void ToByte(String charsetName,String str)
{
System.out.printf("char indexUTF8[]={\"%s\"};\n",str); //當前代碼編輯器爲UTF-8
try {
byte[] b = str.getBytes(charsetName);
System.out.printf("char index%s[]={",charsetName);
for(int i=0;i<b.length;i++)
{
System.out.printf("%#02X,",b[i]);
}
System.out.printf("}; //%s\n",str);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
ToByte("GB2312","監測點溼度溫度℃溼度濃度光照度溼度電磁閥開關狀態開膜大小當前行程土壤");
}
}
我的應用(注意:當前代碼編輯器爲UTF-8)
//漢字UTF-8通過索引數組轉爲GB2312,沒有就跳過
void transUTF8toGB2312(char *strUTF8)
{
//index中本代碼是UTF-8 一個漢字3字節
//indexGB2312對應index的GB2312字節數組。 一個漢字2字節 ,index和indexGB2312一定要根據漢字變動來加,可以多不能少。
char indexUTF8[]={"監測點溼度溫度℃溼度濃度光照度溼度電磁閥開關狀態開膜大小當前行程土壤"};
char indexGB2312[]={0XBC,0XE0,0XB2,0XE2,0XB5,0XE3,0XCA,0XAA,0XB6,0XC8,0XCE,0XC2,0XB6,0XC8,0XA1,0XE6,0XCA,0XAA,0XB6,0XC8,0XC5,0XA8,0XB6,0XC8,0XB9,0XE2,0XD5,0XD5,0XB6,0XC8,0XCA,0XAA,0XB6,0XC8,0XB5,0XE7,0XB4,0XC5,0XB7,0XA7,0XBF,0XAA,0XB9,0XD8,0XD7,0XB4,0XCC,0XAC,0XBF,0XAA,0XC4,0XA4,0XB4,0XF3,0XD0,0XA1,0XB5,0XB1,0XC7,0XB0,0XD0,0XD0,0XB3,0XCC,0XCD,0XC1,0XC8,0XC0,}; //監測點溼度溫度℃溼度濃度光照度溼度電磁閥開關狀態開膜大小當前行程土壤
int i, j, k;
for (i = j = 0; (char)strUTF8[i] != '\0';)
{
if ((unsigned char)strUTF8[i] >= 128) //查找所有漢字
{
for (k = 0; k < strlen(indexUTF8); k = k + 3) //在索引中查找
{
if ((unsigned char)strUTF8[i] == (unsigned char)indexUTF8[k] && (unsigned char)strUTF8[i + 1] == (unsigned char)indexUTF8[k + 1] && (unsigned char)strUTF8[i + 2] == (unsigned char)indexUTF8[k + 2]) //找到索引
{
//printf("k=%d\n",k);
strUTF8[j++] = indexGB2312[k / 3 * 2];
strUTF8[j++] = indexGB2312[k / 3 * 2 + 1];
i++; //跳過一個漢字
i++;
i++;
break;
}
}
if (k >= strlen(indexUTF8)) //沒有找到,就提示加上索引
{
char temp[4] = {0};
memcpy(temp, strUTF8 + i, 3);
printf("ERROR,請加上索引[%s]\n", temp);
i++; //跳過一個漢字
i++;
i++;
}
}
else //非漢字
{
strUTF8[j++] = strUTF8[i];
i++; //跳過一個字符
}
}
strUTF8[j] = '\0';
}
//str刪除所有字符
void delete_char_xiaoyu(char str[], unsigned char target)
{
int i, j;
for (i = j = 0; str[i] != '\0'; i++)
{
if ((unsigned char)str[i] >= target)
{
str[j++] = str[i];
}
//printf("%d,%d,%02X,%02X\n",i,j,(unsigned char)str[i],(unsigned char)str[j]);
}
str[j] = '\0';
}
void getChinese(char *displayContent)
{
char str[200] = {0};
memcpy(str, displayContent, strlen(displayContent));
delete_char_xiaoyu(str, 128);
printf("去掉字符後:%s\n", str); //
}
void LEDdisplay(char *displayContent, char online)
{
printf("%s\n",displayContent);
getChinese(displayContent);
transUTF8toGB2312(displayContent);
char strArray[5][50] = {{0}};
int len = splitString(strArray, displayContent, "\n");
if (len == 3)
{
if (0 == online)
{
memset(strArray[2], 0, 50);
sprintf(strArray[2], "OFFLINE");
}
SendSringToLed(strArray[0],strlen(strArray[0]),1);
SendSringToLed(strArray[1],strlen(strArray[1]),2);
SendSringToLed(strArray[2],strlen(strArray[2]),3);
printf("LEDdisplay Length:%d,%d,%d content:%s;%s;%s;\n", (int)strlen(strArray[0]), (int)strlen(strArray[1]), (int)strlen(strArray[2]), strArray[0], strArray[1], strArray[2]);
}
else
{
printf("ERROR 分割數量不等於3.[%s] --%s:%d\n", displayContent, __FILE__, __LINE__);
}
}
void LEDdisplay_whileTest()
{
while (1)
{
{ //LED顯示
int i = 0;
char display[200] = {0};
sprintf(display, "point#%d\nshi:\n%0.1f", i, 3.12);
LEDdisplay(display, 1);
}
sleep(2);
{ //LED顯示
int i = 20;
char display[200] = {0};
sprintf(display, "point#%d\nwendu:\n%0.1f", i, 4443.12);
LEDdisplay(display, 1);
}
sleep(2);
}
}