線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:10981
推到 Plurk!
推到 Facebook!

請問將日文Ansi轉unicode的正確codepage

答題得分者是:malanlk
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-14 23:08:25 IP:220.135.xxx.xxx 未訂閱
用以下的函數可以將Ansi編碼的文字轉成unicode編碼,要正確使用必須對應正確的codepage。 // ANSI 轉 Unicode function StringToWideString(const S: string; CodePage: Word): WideString; var InputLength, OutputLength: Integer; begin InputLength := Length(S); OutputLength := MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, nil, 0); SetLength(Result, OutputLength); MultiByteToWideChar(CodePage, 0, PChar(S), InputLength, PWideChar(Result), OutputLength); end; 測試例如韓文、簡體都沒問題,但轉日文卻得不到正確的結果。情形是 (1)在win2000與xp繁體中文下測試,電腦皆已勾選包含日文, (2)到MS網站查到的codepage對應表,例如日文ECU編碼是932 (3)下載Yahoo日本首頁之原始碼來測試。 請問是codepage對錯了,還是有其他原因?如果是codepage錯了,哪裡可以找到正確的對應資料,包括日文其他的編碼。 Ian
------
Ian
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-15 00:25:53 IP:61.219.xxx.xxx 未訂閱
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp    試試 51932    037 IBM EBCDIC - U.S./Canada  437 OEM - United States  500 IBM EBCDIC - International   708 Arabic - ASMO 708  709 Arabic - ASMO 449+, BCON V4  710 Arabic - Transparent Arabic  720 Arabic - Transparent ASMO  737 OEM - Greek (formerly 437G)  775 OEM - Baltic  850 OEM - Multilingual Latin I  852 OEM - Latin II  855 OEM - Cyrillic (primarily Russian)  857 OEM - Turkish  858 OEM - Multlingual Latin I + Euro symbol  860 OEM - Portuguese  861 OEM - Icelandic  862 OEM - Hebrew  863 OEM - Canadian-French  864 OEM - Arabic  865 OEM - Nordic  866 OEM - Russian  869 OEM - Modern Greek  870 IBM EBCDIC - Multilingual/ROECE (Latin-2)  874 ANSI/OEM - Thai (same as 28605, ISO 8859-15)  875 IBM EBCDIC - Modern Greek  932 ANSI/OEM - Japanese, Shift-JIS  936 ANSI/OEM - Simplified Chinese (PRC, Singapore)  949 ANSI/OEM - Korean (Unified Hangeul Code)  950 ANSI/OEM - Traditional Chinese (Taiwan; Hong Kong SAR, PRC)   1026 IBM EBCDIC - Turkish (Latin-5)  1047 IBM EBCDIC - Latin 1/Open System  1140 IBM EBCDIC - U.S./Canada (037 + Euro symbol)  1141 IBM EBCDIC - Germany (20273 + Euro symbol)  1142 IBM EBCDIC - Denmark/Norway (20277 + Euro symbol)  1143 IBM EBCDIC - Finland/Sweden (20278 + Euro symbol)  1144 IBM EBCDIC - Italy (20280 + Euro symbol)  1145 IBM EBCDIC - Latin America/Spain (20284 + Euro symbol)  1146 IBM EBCDIC - United Kingdom (20285 + Euro symbol)  1147 IBM EBCDIC - France (20297 + Euro symbol)  1148 IBM EBCDIC - International (500 + Euro symbol)  1149 IBM EBCDIC - Icelandic (20871 + Euro symbol)  1200 Unicode UCS-2 Little-Endian (BMP of ISO 10646)  1201 Unicode UCS-2 Big-Endian   1250 ANSI - Central European   1251 ANSI - Cyrillic  1252 ANSI - Latin I   1253 ANSI - Greek  1254 ANSI - Turkish  1255 ANSI - Hebrew  1256 ANSI - Arabic  1257 ANSI - Baltic  1258 ANSI/OEM - Vietnamese  1361 Korean (Johab)  10000 MAC - Roman  10001 MAC - Japanese  10002 MAC - Traditional Chinese (Big5)  10003 MAC - Korean  10004 MAC - Arabic  10005 MAC - Hebrew  10006 MAC - Greek I  10007 MAC - Cyrillic  10008 MAC - Simplified Chinese (GB 2312)  10010 MAC - Romania  10017 MAC - Ukraine  10021 MAC - Thai  10029 MAC - Latin II  10079 MAC - Icelandic  10081 MAC - Turkish  10082 MAC - Croatia  12000 Unicode UCS-4 Little-Endian  12001 Unicode UCS-4 Big-Endian  20000 CNS - Taiwan   20001 TCA - Taiwan   20002 Eten - Taiwan   20003 IBM5550 - Taiwan   20004 TeleText - Taiwan   20005 Wang - Taiwan   20105 IA5 IRV International Alphabet No. 5 (7-bit)  20106 IA5 German (7-bit)  20107 IA5 Swedish (7-bit)  20108 IA5 Norwegian (7-bit)  20127 US-ASCII (7-bit)  20261 T.61  20269 ISO 6937 Non-Spacing Accent  20273 IBM EBCDIC - Germany  20277 IBM EBCDIC - Denmark/Norway  20278 IBM EBCDIC - Finland/Sweden  20280 IBM EBCDIC - Italy  20284 IBM EBCDIC - Latin America/Spain  20285 IBM EBCDIC - United Kingdom  20290 IBM EBCDIC - Japanese Katakana Extended  20297 IBM EBCDIC - France  20420 IBM EBCDIC - Arabic  20423 IBM EBCDIC - Greek  20424 IBM EBCDIC - Hebrew  20833 IBM EBCDIC - Korean Extended  20838 IBM EBCDIC - Thai  20866 Russian - KOI8-R  20871 IBM EBCDIC - Icelandic  20880 IBM EBCDIC - Cyrillic (Russian)  20905 IBM EBCDIC - Turkish  20924 IBM EBCDIC - Latin-1/Open System (1047 + Euro symbol)  20932 JIS X 0208-1990 & 0121-1990  20936 Simplified Chinese (GB2312)  21025 IBM EBCDIC - Cyrillic (Serbian, Bulgarian)  21027 Extended Alpha Lowercase  21866 Ukrainian (KOI8-U)  28591 ISO 8859-1 Latin I  28592 ISO 8859-2 Central Europe  28593 ISO 8859-3 Latin 3   28594 ISO 8859-4 Baltic  28595 ISO 8859-5 Cyrillic  28596 ISO 8859-6 Arabic  28597 ISO 8859-7 Greek  28598 ISO 8859-8 Hebrew  28599 ISO 8859-9 Latin 5  28605 ISO 8859-15 Latin 9  29001 Europa 3  38598 ISO 8859-8 Hebrew  50220 ISO 2022 Japanese with no halfwidth Katakana  50221 ISO 2022 Japanese with halfwidth Katakana  50222 ISO 2022 Japanese JIS X 0201-1989  50225 ISO 2022 Korean   50227 ISO 2022 Simplified Chinese  50229 ISO 2022 Traditional Chinese  50930 Japanese (Katakana) Extended  50931 US/Canada and Japanese  50933 Korean Extended and Korean  50935 Simplified Chinese Extended and Simplified Chinese  50936 Simplified Chinese  50937 US/Canada and Traditional Chinese  50939 Japanese (Latin) Extended and Japanese  51932 EUC - Japanese 51936 EUC - Simplified Chinese 51949 EUC - Korean 51950 EUC - Traditional Chinese 52936 HZ-GB2312 Simplified Chinese 54936 Windows XP: GB18030 Simplified Chinese (4 Byte) 57002 ISCII Devanagari 57003 ISCII Bengali 57004 ISCII Tamil 57005 ISCII Telugu 57006 ISCII Assamese 57007 ISCII Oriya 57008 ISCII Kannada 57009 ISCII Malayalam 57010 ISCII Gujarati 57011 ISCII Punjabi 65000 Unicode UTF-7 65001 Unicode UTF-8 發表人 - malanlk 於 2005/09/15 00:33:01
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-15 09:00:06 IP:61.218.xxx.xxx 未訂閱
51932之前試過,也是不行。 不知是Delphi的codepage有問題,還是日文轉碼需要用特殊的方式來處理??? Ian
------
Ian
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-15 13:22:36 IP:203.69.xxx.xxx 未訂閱
function StringToWideString(const S: string; CodePage: Word): WideString;
var
  {InputLength,} OutputLength: Integer;
begin
  {InputLength := Length(S);}
  OutputLength := MultiByteToWideChar(CodePage, 0, PChar(S), -1{InputLength}, nil, 0);
  SetLength(Result, OutputLength);
  MultiByteToWideChar(CodePage, 0, PChar(S), -1{InputLength}, PWideChar(Result), OutputLength);
end;
我抓 http://www.sony.co.jp/SonyInfo/News/Press/200509/05-047/index.html CodePage=932 是 OK 的, 又去抓 YAHOO 日本網站(CodePage 51932), 結果也是失敗, trace 之後發現 StringToWideString 在 CodePage 設為 51932 時傳回 0, GetLastError 之後傳回 87 = ERROR_INVALID_PARAMETER, 似乎 MultiByteToWideChar無法轉換51932 成 Unicode.....
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-15 15:00:04 IP:61.218.xxx.xxx 未訂閱
我也測試一下sony網頁,基本上與Yahoo日本首頁編碼不同,是shift-jis,根據MSDN上的對照表的確是用932,但是解碼的結果雖然好很多,但是也不完整,可以看到一些字對應不到變成???。 難道IE的編碼資料庫與作業系統的codepage不一樣?真苦惱。 Ian
------
Ian
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-15 16:26:23 IP:203.69.xxx.xxx 未訂閱
我貼的 Sony 網站全部都完整, 我的環境是 XP SP2 Delphi7 當 MultiByteToWideChar 回應 0 時就表示這個函數不知道如何轉換該字碼到 Unicode http://delphi.ktop.com.tw/QuickSearch.exe/QuickView?topicid=57431 這篇參考參考
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-16 21:45:48 IP:220.135.xxx.xxx 未訂閱
感謝您提供的訊息,除了我是在Delphi 6下編譯,其他都一樣。 上一個回應中提及的文章,若使用unicode補完計畫,只能在Big5環境下看日文,並不適用於其他語文的作業系統。 Ian
------
Ian
sryang
尊榮會員


發表:39
回覆:762
積分:920
註冊:2002-06-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-16 23:58:01 IP:222.95.xxx.xxx 未訂閱
日文編碼有好幾種: JIS(20932)、Shift-JIS(932)、EUC(50932) 要視原始資料用哪一種編碼來決定傳入的 codepage 日本 Yahoo 首頁的編碼是 EUC malanlk 網友用來測試的 Sony 公司網頁的編碼是 Shift-JIS 可以試試瀏覽日本 Yahoo 首頁,然後把編碼設定成 Shift-JIS 看看 或是瀏覽 malanlk 網友用來測試的 Sony 公司網頁,然後把編碼設定成 EUC 看看 一定都是亂碼的 就算是繁體中文編碼也是好多種啊 BIG-5(950)、CNS(20000)、倚天碼(20002)、公會碼(20001)、電信碼(20004)、王安碼(20005)、IBM-5550碼(20003) 只不過我們通常慣用 BIG-5 罷了 之前做 IBM Mainframe 上的案子,英數用的是 EBCDIC 碼,中文用的是 IBM-5550 碼,若不是 IBM 的連線用軟體 IBM Personal Communication 可以幫我們轉換字碼,還不知道要怎麼輸入咧! 加油喔,喵~
------
歡迎參訪 "腦殘賤貓的備忘錄" http://maolaoda.blogspot.com/
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-17 11:02:18 IP:220.135.xxx.xxx 未訂閱
感謝大家的幫忙與提示。看來正確轉碼的關鍵有二:(1)使用正確的codepage對應(這也是我提問的核心,到底是用錯了codepage嗎?喃喃自語),(2)電腦內必須有該編碼對照表存在。 sryang寫道「日本 Yahoo 首頁的編碼是 EUC,malanlk 網友用來測試的 Sony 公司網頁的編碼是 Shift-JIS,可以試試瀏覽日本 Yahoo 首頁,然後把編碼設定成 Shift-JIS 看看,或是瀏覽 malanlk 網友用來測試的 Sony 公司網頁,然後把編碼設定成 EUC 看看一定都是亂碼的」 最新測試結果卻是: 用20932來解雅虎日本首頁很完美,用其他則是亂碼或完全沒有,這與大家的提示都不同。用932解sony網頁大概95%是對的,除了一些字碼對應不到。 另外我是用WinXP SP2 Delphi6,但是電腦內好像找不到51932或50932,所以每次用這兩個codepage,轉碼結果都是空白。 不知道還遺落了甚麼,請大家再幫忙想想。 Ian
------
Ian
malanlk
尊榮會員


發表:20
回覆:694
積分:577
註冊:2004-04-19

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-17 12:37:53 IP:61.219.xxx.xxx 未訂閱
我的思考角度倒有一點不一樣, 我著眼於 MultiByteToWideChar 為何傳回0 去找相關資料以及Registry ....ㄧ無所獲.... 直到    
引言:用20932來解雅虎日本首頁很完美...
我在 HKEY_CLASSES_ROOT\MIME\Database\CodePage\ 下是沒有看到 20932 用程式跑一下 20932 確實可完美轉換... 所以就去搜尋 20932 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Nls\Codepage果然找到了, 而且恰好沒有 51932, 50932 所以就仿 20932 直接加入一個字串值 51932, 再用程式去試, 果然可以正確轉換, 推斷 MultiByteToWideChar 會先來這裡找機碼來做轉換.... 請 ianchen 網友試試...
ianchen
一般會員


發表:12
回覆:6
積分:3
註冊:2003-02-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-17 16:08:53 IP:220.135.xxx.xxx 未訂閱
使用這個 WinApi可以確定電腦內有無該codepage    example:    if IsValidCodePage(866) then   ShowMessage('Correct MS-DOS russian code page');    而malanlk 的說明正好拼出遺落的部分,非常謝謝。
------
Ian
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#12 引用回覆 回覆 發表時間:2007-01-04 21:16:28 IP:59.125.xxx.xxx 訂閱
奇怪的事:
我在registry加了51932
但是 IsValidCodePage(51932) 卻沒有反應 ,這是怎麼回事呢

===================引 用 文 章===================
使用這個 WinApi可以確定電腦內有無該codepage example: if IsValidCodePage(866) then ShowMessage('Correct MS-DOS russian code page'); 而malanlk 的說明正好拼出遺落的部分,非常謝謝。 Ian
------
xinjier禮品贈品
系統時間:2024-04-26 5:49:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!