C語言任意編碼轉換,JAVA編碼生成,示例漢字UTF-8通過索引數組轉爲GB2312,沒有找到,就跳過並提示加上索引。根據索引找到對應字節,再替換就行了。

通過測試,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);
	}
}

 

發佈了331 篇原創文章 · 獲贊 142 · 訪問量 72萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章