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語言漢字gbk轉utf-8
一、注意事項 1.請注意漢字內碼(對應字元為\xcc等)和打印出的轉義字元(\\xcc)的區別!!!!該問題導致我們程式除錯了差不多一整天! 2.另外庫函式iconv會把傳入的引數指標移位,這是正常的、請不要認為是自己程式有問題。 3.我的終端是utf-8格式,對於其他編
網頁格式gbk轉utf-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 中文字串編碼之GBK轉UTF-8
寫過兩篇關於編碼的文章了,以為自己比較瞭解編碼了呢?! 結果今天又結結實實的上了一課。 以前轉來轉去解決的問題終歸還是簡單的情形。即iso-8859-1轉utf-8,或者iso-8859-1轉gbk,gb2312之類。這種無損轉換,一行程式碼就搞定。 今天遇到了gbk轉utf-8。無論怎麼轉,都是亂碼。 一
GBK轉UTF-8時,奇數箇中文會亂碼,偶數箇中文不會亂碼
遇到的問題的場景: 兩個後臺伺服器互動,兩個專案的預設編碼都是UTF-8,但是當互動時(A->B),就會出現奇數箇中文時會亂碼。 重點:GBK編碼是一箇中文2個位元組,而UTF-8編碼是一箇中文3個位元組,當我們呼叫getBytes(“UTF-8”
java gbk轉utf-8亂碼問題
最近在做一個反饋功能,把資料反饋到對方公司網站,我公司是GBK編碼,對方公司是UTF-8編碼。因此,我需要將GBK編碼資料轉換成UTF-8編碼資料,這樣對方網站才不會亂碼。最簡單的方法是將HttpClient的ContentCharset設定為utf-8;如果Content
java程式碼中GBK轉UTF-8的工具類
一.程式碼示例 public static byte[] getUTF8BytesFromGBKString(String gbkStr) { int n = gbkStr.length(); byte[] utfBytes = new byte[3 * n]; in
c++中gbk和utf-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-8、gbk
有如下字串: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
在GBK與UTF-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-8和gbk
轉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-8到GBK轉碼的特殊字元問題
Unicode字符集現在有超過10萬個字元,其BMP部分也有六萬多個字元;而GBK字符集只有兩萬以前多個字元。這樣的話,從支援unicode字符集或者unicode字符集BMP的編碼方式,轉化到GBK編碼的時候,就會有編碼落到GBK字符集以外,不能轉化成GBK編碼。在java中,轉換之後的字串,這部分字元都
C++ 過濾出字串的中文(GBK,UTF-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,GBK和UTF-8字符編碼的區別聯系
技術 最大的 發展 時代 AC 人類 資料 新的 字節 ASCII,Unicode,GBK和UTF-8字符編碼的區別聯系 wyrssktzc11級分類:其他被瀏覽86次2016.05.27 檢舉 KingSta逍遙 采納率:45%7級20