日韩性视频-久久久蜜桃-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以及字符集转换的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 看污片网站 | 性猛交ⅹxxx富婆video | 国产精品无码久久久久高潮 | 色偷偷资源网 | 中文字幕在线影院 | 欧美日韩精品在线视频 | 国产精品一二三级 | 福利一区二区视频 | 99色网站 | 性网址| 成都4电影免费高清 | 制服丝袜天堂网 | 三级精品在线 | 韩国三级做爰视频 | 我不卡一区二区 | 玩弄少妇人妻 | 在线看片网址 | 粉嫩av.com | 黄色一级免费大片 | 亚洲精品乱码久久久久久按摩观 | 天天操天天射天天舔 | 狠狠干2018| 又大又长粗又爽又黄少妇视频 | 欧洲久久久久 | 亚洲第一av网 | 99re久久精品国产 | 美女黄色录像 | 香蕉视频成人在线 | 综合精品国产 | 免费a在线| avav国产| 国产三区av | 黄色大片免费的 | 国产成人无码av在线播放dvd | 欧美日韩在线网站 | 曰本丰满熟妇xxxx性 | 少妇人妻偷人精品无码视频 | 黄片毛片 | 波多野结衣欧美 | 最近中文字幕在线视频 | 一本大道av伊人久久综合 | 成人在线电影网站 | 波多野结衣99 | 久久国产区| 朋友的姐姐2在线观看 | 成人网页在线观看 | 老牛影视一区二区三区 | 日本少妇xxxx软件 | 国产精品一区二区性色av | 中国女人性猛交 | 久久艹国产精品 | a毛毛片| 中文国产| 四虎国产精品永久免费观看视频 | 日韩精品网站 | 美女啪啪av | 国产馆视频 | 日本一区二区三区四区视频 | 日韩欧美亚洲精品 | 91抖音在线观看 | 91caob | αv在线| 日韩在线国产精品 | 国产欧美日韩综合精品一区 | 亚洲天堂视频网 | 夜夜天天| 第一福利丝瓜av导航 | 成人a v视频| 色人天堂 | 亚洲精品一区二区三 | 裸体裸乳被免费看视频 | 爱久久| 日韩色小说 | 亚洲色图1| 亚洲第一页综合 | 国产无套内射又大又猛又粗又爽 | 看毛片看毛片 | 亚洲最大成人综合网 | 免费看一级一片 | 国产精品815.cc红桃 | 一级黄色录相 | 天天爽| 一级片欧美 | 男女无遮挡网站 | 伊人22综合 | 成人激情在线视频 | 天堂一区二区三区 | 精品久久二区 | av高清在线观看 | 成人影视在线播放 | 日日躁夜夜躁白天躁晚上躁91 | bl动漫在线观看 | 国产男女网站 | av作品在线| 最新高清无码专区 | 国产精品水嫩水嫩 | 久久免费在线视频 | 久久这里只有精品8 | 97视频在线观看免费高清完整版在线观看 |