Windows, UTF8 and string


有些很容易理解的問題, 換成不一樣的外包裝, 有時候會讓人覺得不知所措

為了讓對方看到中文字, 折騰了一陣子, 沒有頭緒, 後來諮詢查詢別人, 了解到原來WINDOW還是有特別不一樣的設計, 簡單總結一下

WINDOWS 電腦系統會有個內定的 CODE PAGE, 所有的文字都是基於其上

比如 [你好] 這兩個中文字,

BIG5 繁體版的字庫  = [A7, 41, A6, 6E ] 4 BYTE

UTF-8 的字串編碼 =  [ E4 BD A0 E5 A5 BD ] 6 BYTE

重點來了, 看得懂的人就明白, 看不明白的, 還是不懂.

能不能解釋以上的資料而得到 [你好] 兩個字, 完全取決於接收端的能耐, 還有就是你送給它甚麼字料.

所以, 如果電腦 A 是 BIG5 的語文設定, 你給它這串 [A7, 41, A6, 6E], 就會顯示 [你好], 但是給它這串 [ E4 BD A0 E5 A5 BD ], 顯示錯亂

相對的, 如果電腦 A 是 UTF-8 的語文設定, 那也要給它適合的字串, 才會顯示 [你好].

既然明白了基本原理, 下一步就是要如何辦到.

如果撇除很多包裝好的資訊, 從最基本去理解接受端看不到中文字的原因, 那就是, 你給它的字串不對, 所以就會顯示不到, 那….

如何把 字串 B 轉換成 字串 U, 然後再送出去

WINDOWS 裡面提供了兩個 API (注, 以下的 CODE 不一定在其他的編譯程序正常通過, 俺用 VISUAL STUDIO 2012 C++, 目的是提供一個轉換過過程的說明)


char *我的字串[] = "hello,中文字";
wchar_t *pwszUnicode;
char *pszUTF8_from_ansi = NULL;

// 如果 我的字串 是 ANSI 版, 用 CP_ACP)
// 如果 我的字串 是簡體版 CP_ACP 改成 936

//取得 我的字串 轉換成 UNICODE字串 後的長度, (-1) 的特別意義
int i = MultiByteToWideChar (CP_ACP, 0, 我的字串, -1, NULL,0) ;

//臨時訂定一個存放 UNICODE字串的位置, 長度是 i
pwszUnicode = new wchar_t[i];

//執行轉換
MultiByteToWideChar (CP_ACP, 0, 我的字串, -1, pwszUnicode,i);

//************************************************
//轉換後的字串是 UTF16, 必須再做一次轉換變成 UTF8
//計算長度
iLen2 = WideCharToMultiByte(CP_UTF8, 0, (PWSTR) pwszUnicode, -1, NULL, 0, NULL, NULL);

//建立存放空間
pszUTF8_from_ansi = new char[iLen2];

//執行轉換, 這樣, 我的字串 就變成了 UTF-8
WideCharToMultiByte(CP_UTF8, 0, (PWSTR) pwszUnicode, -1, pszUTF8_from_ansi, iLen2, NULL, NULL);

REF

http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=105073
http://www.nubaria.com/en/blog/?p=289
http://msdn.microsoft.com/en-us/library/windows/desktop/dd319072%28v=vs.85%29.aspx
http://zaemis.blogspot.tw/2011/06/reading-unicode-utf-8-by-hand-in-c.html
http://learn.akae.cn/media/apas03.html

UNIT CODE 轉換工具
http://www.endmemo.com/unicode/unicodeconverter.php

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s