1. 程式人生 > >C語言漢字gbk轉utf-8

C語言漢字gbk轉utf-8

一、注意事項

1.請注意漢字內碼(對應字元為\xcc等)和打印出的轉義字元(\\xcc)的區別!!!!該問題導致我們程式除錯了差不多一整天!

2.另外庫函式iconv會把傳入的引數指標移位,這是正常的、請不要認為是自己程式有問題。

3.我的終端是utf-8格式,對於其他編碼不能顯示。

二、看看code

1.test.c

#include <iconv.h>
#include <stdio.h>
#include <string.h>

int code_convert(char *inbuf,int inlen,char *outbuf,int outlen)
{
        iconv_t cd;
        int rc;
        char **pin = &inbuf;
        char **pout = &outbuf;

        cd = iconv_open("UTF-8","GB2312");
        if (cd==0)
                return -1;
        memset(outbuf,0,outlen);
        if (iconv(cd,pin,&inlen,pout,&outlen) == -1)
                return -1;
        iconv_close(cd);
        return 0;
}

int main(){
  char src[4096] = "\xcc\xb7\xbf\xad";
  //注意:此處寫為char src[4096] = "ccb7bfad";將不會被轉換,因為系統認為是英文字母、而不是gbk的內碼!
  char dst[4096];
  int srclen = 4096;
  int dstlen = 4096;
  int ret = code_convert(src,srclen,dst,dstlen);
  printf("TK--------->>>>ret is %d\nsrc is %s\ndst is %s\n",ret,src,dst);
  return 0;
}

2.gcc test.c -o test

3../test

TK--------->>>>ret is -1
src is ̷��
dst is 譚凱

三、iconv命令的正確使用

1.錯誤做法

vi input

\xcc\xb7\xbf\xad

iconv -f gb2312 -t utf-8 input >output

vi output

\xcc\xb7\xbf\xad

原因:在程式設計時\x是一個轉義字元,可以說明\xcc只是一個十六進位制的字元;但在檔案中不可以這樣做!

2.正確做法

vi input

譚凱

iconv -f gb2312 -t utf-8 input >output

vi output

Ì·¿

四、專案總結

當遇到底層上報有誤,即:把"\xcc"上報成"\\xcc"時(前者包含一個字元‘\xcc’,後者包含4個字元'\\' ,'x','c','c')可以用提取後邊兩個字元,完後在新增的方法解決。

解決方法如下:

1.程式碼

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iconv.h>

long atox(char *s){
 return strtol(s,NULL,16);
}

int main()
{
	char a[17] = "\\xcc\\xb7\\xbf\\xad";  
	printf("a is %s\nstrlen(a) is %d\n",a,strlen(a));

    a[4] = '\0';
	a[8] = '\0';
	a[12] = '\0' ;
	if(a[0] == '\\'){
	  printf("atoi(&a[2]) is %d\n",atox(&a[2]));
	  printf("atoi(&a[6]) is %d\n",atox(&a[6]));
	  printf("atoi(&a[10]) is %d\n",atox(&a[10]));
	  printf("atoi(&a[14]) is %d\n",atox(&a[14]));
	}

	return 0;	
}

2.gcc test.c -o test

./test

a is \xcc\xb7\xbf\xad
strlen(a) is 16
atoi(&a[2]) is 204
atoi(&a[6]) is 183
atoi(&a[10]) is 191
atoi(&a[14]) is 173


相關推薦

C語言漢字gbkutf-8

一、注意事項 1.請注意漢字內碼(對應字元為\xcc等)和打印出的轉義字元(\\xcc)的區別!!!!該問題導致我們程式除錯了差不多一整天! 2.另外庫函式iconv會把傳入的引數指標移位,這是正常的、請不要認為是自己程式有問題。 3.我的終端是utf-8格式,對於其他編

網頁格式gbkutf-8【python requests】

sts url ont content req utf nic tex ext resp = requests.get(url) resp.content 是str格式 resp.text是unicode格式 如果返回的中文使用gbk編碼,需要轉換成utf-8的時候:

檔案編碼轉化 GBK UTF-8工具類

import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import ja

Java 中文字串編碼之GBKUTF-8

寫過兩篇關於編碼的文章了,以為自己比較瞭解編碼了呢?! 結果今天又結結實實的上了一課。 以前轉來轉去解決的問題終歸還是簡單的情形。即iso-8859-1轉utf-8,或者iso-8859-1轉gbk,gb2312之類。這種無損轉換,一行程式碼就搞定。 今天遇到了gbk轉utf-8。無論怎麼轉,都是亂碼。 一

GBKUTF-8時,奇數箇中文會亂碼,偶數箇中文不會亂碼

遇到的問題的場景: 兩個後臺伺服器互動,兩個專案的預設編碼都是UTF-8,但是當互動時(A->B),就會出現奇數箇中文時會亂碼。 重點:GBK編碼是一箇中文2個位元組,而UTF-8編碼是一箇中文3個位元組,當我們呼叫getBytes(“UTF-8”

java gbkutf-8亂碼問題

最近在做一個反饋功能,把資料反饋到對方公司網站,我公司是GBK編碼,對方公司是UTF-8編碼。因此,我需要將GBK編碼資料轉換成UTF-8編碼資料,這樣對方網站才不會亂碼。最簡單的方法是將HttpClient的ContentCharset設定為utf-8;如果Content

java程式碼中GBKUTF-8的工具類

一.程式碼示例 public static byte[] getUTF8BytesFromGBKString(String gbkStr) { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; in

c++中gbkutf-8

gbk轉utf-8 char* G2U(const char* gb2312) { ASSERT(gb2312!=NULL); int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);

C語言實現windows1251編碼utf-8編碼

windows1251是俄羅斯本地的一種編碼,不通用。mini xml好像無法解析,但客戶就是提供一個這種編碼檔案的url,讓你解析裡面的資料。 開源的編碼轉換庫又太大,只好用C語言寫一個。有些字元轉換沒什麼規律,只能一一對應,很耿直的轉換方式,哈哈~~,不過以後如果遇到相

字串互utf-8gbk

有如下字串:n = "路飛學城"(程式設計題)       - 將字串轉換成utf-8的字元編碼,再將轉換的位元組重新轉換為utf-8的字元編碼 n = "路飛學城" n_e_u = n.encode("utf-8") # b'\xe8\xb7\xaf\x

PHP中文GBK編碼UTF-8

iconv 和 mb_convert_encoding的區別 函式比較 string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] ) 需要先enable mbstring 擴充套件庫,在 php

GBKUTF-8時遇到問題,及解決方案

當文字長度為奇數時轉為GBK再轉回UTF-8時會出現末尾字元亂碼的情況,在此特地記錄一下解決方案 最近在寫一個根據模板標籤生成word的專案,在本地測試無問題但是放到伺服器上會出現生成字元亂碼的情況, 考慮到GBK轉UTF-8使用getBytes只有在長度為

Java專案GBK編碼UTF-8

方法一:使用Apache的common-io 1.maven專案pom.xml <dependency> <groupId>commons-io</groupId> <artif

Android ndk中字串utf-8gbk

轉utf-8jstring cToJstringutf(JNIEnv* env, const char* pat) { jclass strClass = (*env)->FindClass(env, "java/lang/String"); jmethodID

用python批量處理gbk/gb2312格式檔案utf-8

#-*-coding:utf-8 -*- import os folder ='G:\Reduced' #儲存文字的目錄 listDir = [ dirs[0] for dirs in os.walk(folder)][1:]#獲取所有的子目錄 for dataDir in

[]UTF-8GBK碼的特殊字元問題

Unicode字符集現在有超過10萬個字元,其BMP部分也有六萬多個字元;而GBK字符集只有兩萬以前多個字元。這樣的話,從支援unicode字符集或者unicode字符集BMP的編碼方式,轉化到GBK編碼的時候,就會有編碼落到GBK字符集以外,不能轉化成GBK編碼。在java中,轉換之後的字串,這部分字元都

C++ 過濾出字串的中文(GBKUTF-8

最近在處理遊戲敏感詞之類的東西,為了加強遮蔽處理,所以需要過濾掉字串中的除漢字之外的是其他東西如數字,符號,英文字母等。 首先我查閱資料並寫了個函式: 示例:返回輸入字串中漢字的個數: std::string StrWithOutSymbol(const std::string &sourc

java讀取配置文件(properties)的時候,unicode碼utf-8

keyword lin isp decode margin ase main spl key 有時我們在讀取properties結尾的配置文件的時候,如果配置文件中有中文,那麽我們讀取到的是unicode碼的中文,需要我們在轉換一下,代碼如下/** * 將配置文件

C# MD5 32位加密 UTF-8編碼

spl 十六進制 post ring one 類型 開始 出現問題 int 項目開發過程中需要用到MD5加密,最開始的使用使用加密方法: public static string GetMD5(string str) { byte[] b = System

ASCII,Unicode,GBKUTF-8字符編碼的區別聯系

技術 最大的 發展 時代 AC 人類 資料 新的 字節 ASCII,Unicode,GBK和UTF-8字符編碼的區別聯系 wyrssktzc11級分類:其他被瀏覽86次2016.05.27 檢舉 KingSta逍遙 采納率:45%7級20