日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unicode以及字符集转换

發布時間:2024/3/12 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unicode以及字符集转换 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

曾經碰到一個問題,
項目需要支持日文操作系統,但是沒有編譯成unicode程序。
然后在一個解析用戶輸入路徑的地方出問題了。
原因是日文的"表"這個漢字,日文編碼格式下,低字節和反斜杠'/'編碼一樣,解析的時候把它當成路徑的分隔符了。:-(
// 項: 8D 80 (Shift_JIS)
// 目: 96 DA (Shift_JIS)
// 表: 95 5C (Shift_JIS)
// /: 5C (Shift_JIS)

反思一下,如果要支持國際化,最正確也最簡單的辦法是都編譯成Unicode程序。
當然這樣就很有可能需要進行些字符集的轉換,整理了4個函數。
還可以組合使用,比如要多字節字符串-->UTF8格式字符串,可以調用1)+3)。

1)當前系統編碼的多字節字符串-->Unicode格式字符串

bool multiToUnicode(const std::string& multiText, std::wstring& unicodeText) { if (0 == multiText.length()) { unicodeText.clear(); return true; } //先獲取轉換后字符串所需空間 int size = ::MultiByteToWideChar(CP_ACP, 0, multiText.c_str(), -1, NULL, 0); if (0 == size) { return false; } //分配空間,進行轉換 wchar_t* wszBuffer = new wchar_t[size + 1]; ::ZeroMemory(wszBuffer, (size + 1) * sizeof(wchar_t)); if (0 == ::MultiByteToWideChar(CP_ACP, 0, multiText.c_str(), -1, wszBuffer, size + 1)) { delete[] wszBuffer; return false; } unicodeText = wszBuffer; delete[] wszBuffer; return true; }


2)Unicode格式字符串-->當前系統編碼的多字節字符串

bool unicodeToMulti(const std::wstring& unicodeText, std::string& multiText) { if (0 == unicodeText.length()) { multiText.clear(); return true; } //先獲取轉換后字符串所需空間 int size = ::WideCharToMultiByte(CP_ACP, 0, unicodeText.c_str(), -1, NULL, 0, NULL, NULL); if (0 == size) { return false; } //分配空間,進行轉換 char* szBuffer = new char[size + 1]; ::ZeroMemory(szBuffer, (size + 1) * sizeof(char)); if (0 == ::WideCharToMultiByte(CP_ACP, 0, unicodeText.c_str(), -1, szBuffer, size + 1, NULL, NULL)) { delete[] szBuffer; return false; } multiText = szBuffer; delete[] szBuffer; return true; }


3)Unicode格式字符串-->UTF8格式字符串

bool unicodeToUtf8(const std::wstring& unicodeText, std::string& utf8Text) { if (0 == unicodeText.length()) { utf8Text.clear(); return true; } //先獲取轉換后字符串所需空間 int size = ::WideCharToMultiByte(CP_UTF8, 0, unicodeText.c_str(), -1, NULL, 0, NULL, NULL); if (0 == size) { return false; } //分配空間,進行轉換 char* szBuffer = new char[size + 1]; ::ZeroMemory(szBuffer, (size + 1) * sizeof(char)); if (0 == ::WideCharToMultiByte(CP_UTF8, 0, unicodeText.c_str(), -1, szBuffer, size + 1, NULL, NULL)) { delete[] szBuffer; return false; } utf8Text = szBuffer; delete[] szBuffer; return true; }


4)UTF8格式字符串-->Unicode格式字符串

bool utf8ToUnicode(const std::string& utf8Text, std::wstring& unicodeText) { if (0 == utf8Text.length()) { unicodeText.clear(); return true; } //先獲取轉換后字符串所需空間 int size = ::MultiByteToWideChar(CP_UTF8, 0, utf8Text.c_str(), -1, NULL, 0); if (0 == size) { return false; } //分配空間,進行轉換 wchar_t* wszBuffer = new wchar_t[size + 1]; ::ZeroMemory(wszBuffer, (size + 1) * sizeof(wchar_t)); if (0 == ::MultiByteToWideChar(CP_UTF8, 0, utf8Text.c_str(), -1, wszBuffer, size + 1)) { delete[] wszBuffer; return false; } unicodeText = wszBuffer; delete[] wszBuffer; return true; }


補充1)
_UNICODE vs UNICODE
在學習UNICODE的過程中發現有兩種關于UNICODE的宏定義: UNICODE和_UNICODE.

UNICODE:
這個宏主要是在Windows SKD中使用, 比如GetWindowText(), 定義了UNICODE以后將被定義為GetWindowTextW(UNICODE版本),否則被定義成GetWindowTextA(ANSI版本).

_UNICODE:
該宏一般用在C運行時庫和MFC頭文件中, 這時候函數_tcslen()將被映射為wcslen(), 反之被映射為strlen(). 至于在MFC中, 一般存在如下的定義:
#ifdef _UNICODE
#ifndef UNICODE
#define UNICODE
#endif
#endif

#ifdef UNICODE
#ifndef _UNICODE
#define _UNICODE
#endif
#endif
所以在MFC使用哪個都可以.

總結:兩個都用上總不會有錯的:)

補充2)
VC6中為了編譯Unicode軟件出了需要添加_UNICODE宏定義外,還需要增加一步:指定程序的入口位置。
否則程序將會發生如下錯誤:error LNK2001: unresolved external symbol _WinMain@16。
解決辦法:在Project Settings > Entry-point symbol編輯框中輸入wWinMainCRTStartup。

補充3)
C++比Unicode出生得早,所以最開始沒有考慮Unicode支持,char類型是單字節的。
wchar_t實際上是typedef定義。
所以特別要注意防止下面錯誤。
CString sText = _T("123456789");
int nLength = sText.getLength() //i=9
CFile cFile;
......
cFile.Write(sText,sText.getLength());
這段代碼再普通不過了,編譯也不會有任何問題。但是實際上輸出的內容將會是錯誤的。正確的代碼應該如下:
CString sText = _T("123456789");
int nLength = sText.getLength() //i=9
CFile cFile;
......
cFile.Write(sText,sText.getLength()×sizeof(_TCHAR));

補充4)
Java設計的時候已經考慮了對unicode的支持,所以Java的char類型占用2個字節。
Java中如果要進行字符集轉換就簡單多了,寫了個程序測試了一下。

/* * Created on 2011/01/04 * * TODO To change the template for this generated file go to * Window - Preferences - Java - Code Style - Code Templates */ package learning.io; import java.io.UnsupportedEncodingException; import java.util.Locale; // import learning.util.StringToCharSequence; /** * @author * * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */ public class CharEncodingTest { public static void main(String[] args) throws UnsupportedEncodingException { System.out.println(Locale.getDefault().getDisplayCountry()); System.out.println(System.getProperty("file.encoding")); // /// // Unicode -> UTF8 // 06543210 0xxxxxxx // 110(10)9876 10543210 110xxxxx 10xxxxxx // 1110(15)(14)(13)(12) 10(11)(10)9876 10543210 1110xxxx 10xxxxxx // 10xxxxxx // /// // /// // 項目表\ // 項: unicode, int=38917 \u9805 // 目: unicode, int=30446 \u76EE // 表: unicode, int=34920 \u8868 // \: unicode, int=92 \u005C // // 項: E9 A0 85 (UTF8, 9805 --> E9 A0 85) // 目: E7 9B AE (UTF8, 76EE --> E7 9B AE) // 表: E8 A1 A8 (UTF8, 8868 --> E8 A1 A8) // \: 5C (UTF8, 005C --> 5C) // 項: 8D 80 (Shift_JIS) // 目: 96 DA (Shift_JIS) // 表: 95 5C (Shift_JIS) // \: 5C (Shift_JIS) // /// // /// // 項目表\ // 項: unicode, int=39033 \u9879 // 目: unicode, int=30446 \u76EE // 表: unicode, int=34920 \u8868 // \: unicode, int=92 \u005C // // 項: E9 A1 B9 (UTF8, 9879 --> E9 A1 B9) // 目: E7 9B AE (UTF8, 76EE --> E7 9B AE) // 表: E8 A1 A8 (UTF8, 8868 --> E8 A1 A8) // \: 5C (UTF8, 005C --> 5C) // 項: CF EE (GBK) // 目: C4 BF (GBK) // 表: B1 ED (GBK) // \: 5C (GBK) // /// parseString("項目表\\"); // "ABAB" String strUTF8 = String.valueOf(new char[] {0xEF, 0xBC, 0xA1, 0xEF, 0xBC, 0xA2, 0x41, 0x42}); String strJP = String.valueOf(new char[] {0x82, 0x60, 0x82, 0x61, 0x41, 0x42}); String strCN = String.valueOf(new char[] {0xA3, 0xC1, 0xA3, 0xC2, 0x41, 0x42}); // "UTF8" -> "Unicode" String strUnicode1 = new String(strUTF8.getBytes("ISO-8859-1"), "UTF8"); // "Shift_JIS" -> "Unicode" String strUnicode2 = new String(strJP.getBytes("ISO-8859-1"), "Shift_JIS"); // "GBK" -> "Unicode" String strUnicode3 = new String(strCN.getBytes("ISO-8859-1"), "GBK"); System.out.println(strUnicode1); System.out.println(strUnicode2); System.out.println(strUnicode3); } public static void parseString(String strTest) throws UnsupportedEncodingException { printCharArray(strTest); System.out.println("UTF8:"); byte a[] = strTest.getBytes("UTF8"); printByteArray(a); System.out.println("Shift_JIS:"); byte b[] = strTest.getBytes("Shift_JIS"); printByteArray(b); System.out.println("GBK:"); byte c[] = strTest.getBytes("GBK"); // Encode into "GBK" printByteArray(c); } public static void printByteArray(byte[] bytes) { for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i]).toUpperCase(); StringBuffer sb = new StringBuffer(); // print byte sb.append("byte["); sb.append(i); sb.append("]='"); sb.append(bytes[i]); sb.append("'\t"); // short value sb.append(hex); sb.append('\t'); System.out.println(sb.toString()); } System.out.println(); } public static void printCharArray(String inStr) { char[] myBuffer = inStr.toCharArray(); // list each Charactor in byte value, short value, // and UnicodeBlock Mapping for (int i = 0; i < inStr.length(); i++) { int s = (int) myBuffer[i]; String hexS = Integer.toHexString(s).toUpperCase(); StringBuffer sb = new StringBuffer(); // print char sb.append("char["); sb.append(i); sb.append("]='"); sb.append(myBuffer[i]); sb.append("'\t"); // int value sb.append("int="); sb.append(s); sb.append(" \\u"); sb.append(hexS); sb.append('\t'); // Unicode Block sb.append(Character.UnicodeBlock.of(myBuffer[i])); System.out.println(sb.toString()); } System.out.println(); } }

總結

以上是生活随笔為你收集整理的Unicode以及字符集转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 狠狠撸视频 | 亚洲激情国产 | 老司机伊人 | 青春草在线视频观看 | 免费视频色 | 久久久国产精华液999999 | 黑人玩弄人妻一区二区三区四 | 久久久久亚洲av成人毛片韩 | avav我爱av | 欧美肉大捧一进一出免费视频 | 中国浓毛少妇毛茸茸 | 在线观看视频你懂得 | 久久久久亚洲AV成人 | 波多野结衣久久久久 | 91丨九色丨丰满人妖 | 天天操夜夜操 | 精品视频在线观看 | 日本精品一区二区三区视频 | 日韩精品免费视频 | 久久禁 | 欧美激情 国产精品 | 久久精品香蕉 | 欧美日韩在线视频一区二区三区 | 麻豆免费观看视频 | 免费看黄色a级片 | 色欲一区二区三区精品a片 在线观看黄网站 | 黄色网址视频 | 国产福利91精品一区二区三区 | 天天看片天天操 | www.啪| 国产日韩欧美视频在线 | 欧美理伦片在线播放 | 全黄一级裸片视频 | 国产老熟女一区二区三区 | 久久99国产精品久久99 | 久久久国产精品一区二区三区 | 精品无码久久久久久国产 | 国产手机在线观看 | 国产精品视频一区二区三区, | 国产精品一二三四 | 欧美日韩亚洲激情 | 免费欧美黄色片 | 午夜a区| 国产亚洲精品av | 青娱乐福利视频 | 国产情侣第一页 | 少女情窦初开的第4集在线观看 | 精品少妇人妻av免费久久久 | 成人h网站 | 精品人妻久久久久一区二区三区 | 久久久久夜夜夜精品国产 | 午夜精品免费 | 久久精品这里 | 国产伦精品一区二区三区视频我 | 午夜免费观看 | 成人一级影片 | av日韩中文字幕 | 亚洲国产欧美在线观看 | 亚洲有吗在线 | 中文在线免费视频 | 久草久| 日本三级免费 | 国产成人精品无码片区在线 | 高清不卡一区 | 无码精品视频一区二区三区 | 亚洲 欧美 日韩 国产综合 在线 | 天天射寡妇 | 国产高清免费视频 | 在线xxxx| www.夜夜骑 | 日韩色图一区 | 国产精品一区电影 | 爱爱视频免费网站 | 亚洲熟妇无码av | 在线免费观看黄色网址 | 毛片无码免费无码播放 | 亚洲孕交 | 啦啦啦av | 国产中文字幕在线观看 | 欧美日韩一区二区视频观看 | 九九热最新视频 | 国产三级成人 | 手机福利视频 | 操女人视频网站 | 99热久 | 澳门色网| 久久橹| 超碰666| 国产乱妇乱子 | 国产精品theporn | 日韩黄色av网站 | 亚欧精品视频一区二区三区 | 亚洲免费观看高清在线观看 | 在线免费亚洲 | 又色又爽又高潮免费视频国产 | 三级少妇 | 97国产 | 激情午夜av | 日韩av中文 |