【转】SetThreadLocale解决越南文乱码问题

转自http://hi.baidu.com/killwolf110/item/838d56224067c63395f62b70

 

    程序需要运行在越南地区,语言为越南文,操作系统为英文版,程序支持unicode,但是显示时还是出现乱码,主要出现在越南文的标点符号位置。

    解决办法:
    1.控制面板 ——> 区域和语言选项——>语言——> 附加的语言支持 ——> 为复制文字和从右到左的语言安装文件(包括泰文) 为东亚语言安装文件选中上面的checkbox,然后系统自动安装语言包,再次运行程序,显示正常。

    2.程序内部设置区域
    使用SetThreadLocale函数设置运行区域,如越南文:
    【delphi】SetThreadLocale($042A); 

    设置前最好判断下环境,在特定的环境下才设置:

//处理越南文 ,$0409是英语 - 美国, $042A是越南,$0804是中文
//if (word(GetSystemDefaultLangID() and $eFF)=Lang_English) then
if (GetThreadLocale=$042A) or (GetThreadLocale=$0409) then //取得当前线程的地方ID 
begin
SetThreadLocale($042A);              
end;

 

    代码添加在程序初始化的地方
    前提是控件支持Unicode,如TNT系列控件或AlphaControls(要开启TNT编译选项并重新编译并安装)

    字体也是个问题,有时拖放控件的默认字体是不被支持的,显示时就会出现异常,如Dong,会显示为Doong或Donng,甚至是Do|ng。把字体换为 Tahoma,编码为默认,就好了。


    3.非程序,如Flash
    解决办法是在英语操作系统里面,安装英文版本的Flash制作工具,如Flash MX
    在这个环境里面重新生成之前在中文环境里的flash。

 

    区域设置 ID (LCID) 表

    

 

区域设置描述简写十六进制值十进制值
南非荷兰语 af 0x0436 1078
阿尔巴尼亚语 sq 0x041C 1052
阿拉伯语 - 阿拉伯联合酋长国 ar-ae 0x3801 14337
阿拉伯语 - 巴林 ar-bh 0x3C01 15361
阿拉伯语 - 阿尔及利亚 ar-dz 0x1401 5121
阿拉伯语 - 埃及 ar-eg 0x0C01 3073
阿拉伯语 - 伊拉克 ar-iq 0x0801 2049
阿拉伯语 - 约旦 ar-jo 0x2C01 11265
阿拉伯语 - 科威特 ar-kw 0x3401 13313
阿拉伯语 - 黎巴嫩 ar-lb 0x3001 12289
阿拉伯语 - 利比亚 ar-ly 0x1001 4097
阿拉伯语 - 摩洛哥 ar-ma 0x1801 6145
阿拉伯语 - 阿曼 ar-om 0x2001 8193
阿拉伯语 - 卡塔尔 ar-qa 0x4001 16385
阿拉伯语 - 沙特阿拉伯 ar-sa 0x0401 1025
阿拉伯语 - 叙利亚 ar-sy 0x2801 10241
阿拉伯语 - 突尼斯 ar-tn 0x1C01 7169
阿拉伯语 - 也门 ar-ye 0x2401 9217
巴斯克语 eu 0x042D 1069
白俄罗斯语 be 0x0423 1059
保加利亚语 bg 0x0402 1026
加泰罗尼亚语 ca 0x0403 1027
中文 - 中华人民共和国 zh-cn 0x0804 2052
中文 - 中华人民共和国香港特别行政区 zh-hk 0x0C04 3076
中文 - 新加坡 zh-sg 0x1004 4100
中文 - 台湾地区 zh-tw 0x0404 1028
克罗地亚语 hr 0x041A 1050
捷克语 cs 0x0405 1029
丹麦语 da 0x0406 1030
荷兰语 nl 0x0413 1043
荷兰语 - 比利时 nl-be 0x0813 2067
英语 - 澳大利亚 en-au 0x0C09 3081
英语 - 伯利兹 en-bz 0x2809 10249
英语 - 加拿大 en-ca 0x1009 4105
英语 - 爱尔兰 en-ie 0x1809 6153
英语 - 牙买加 en-jm 0x2009 8201
英语 - 新西兰 en-nz 0x1409 5129
英语 - 南非 en-za 0x1C09 7177
英语 - 特立尼达岛 en-tt 0x2C09 11273
英语 - 英国 en-gb 0x0809 2057
英语 - 美国 en-us 0x0409 1033
爱沙尼亚语 et 0x0425 1061
波斯语 fa 0x0429 1065
芬兰语 fi 0x040B 1035
法罗语 fo 0x0438 1080
法语 - 标准 fr 0x040C 1036
法语 - 比利时 fr-be 0x080C 2060
法语 - 加拿大 fr-ca 0x0C0C 3084
法语 - 卢森堡 fr-lu 0x140C 5132
法语 - 瑞士 fr-ch 0x100C 4108
盖尔语 - 苏格兰 gd 0x043C 1084
德语 - 标准 de 0x0407 1031
德语 - 奥地利 de-at 0x0C07 3079
德语 - 列支敦士登 de-li 0x1407 5127
德语 - 卢森堡 de-lu 0x1007 4103
德语 - 瑞士 de-ch 0x0807 2055
希腊语 el 0x0408 1032
Hebrew he 0x040D 1037
印地语 hi 0x0439 1081
匈牙利语 hu 0x040E 1038
冰岛语 is 0x040F 1039
印度尼西亚语 in 0x0421 1057
意大利语 - 标准 it 0x0410 1040
意大利语 - 瑞士 it-ch 0x0810 2064
日语 ja 0x0411 1041
朝鲜语 ko 0x0412 1042
拉脱维亚语 lv 0x0426 1062
立陶宛语 lt 0x0427 1063
马其顿语 mk 0x042F 1071
马来语 - 马来西亚 ms 0x043E 1086
马耳他语 mt 0x043A 1082
挪威语 - 博克马尔 no 0x0414 1044
波兰语 pl 0x0415 1045
葡萄牙语 - 标准 pt 0x0816 2070
葡萄牙语 - 巴西 pt-br 0x0416 1046
拉托-罗马语 rm 0x0417 1047
罗马尼亚语 ro 0x0418 1048
罗马尼亚语 - 摩尔多瓦 ro-mo 0x0818 2072
俄语 ru 0x0419 1049
俄语 - 摩尔多瓦 ru-mo 0x0819 2073
塞尔维亚语 - 塞瑞利克 sr 0x0C1A 3098
Setsuana tn 0x0432 1074
斯洛文尼亚语 sl 0x0424 1060
斯洛伐克语 sk 0x041B 1051
索布语 sb 0x042E 1070
西班牙语 - 标准 es 0x040A 1034
西班牙语 - 阿根廷 es-ar 0x2C0A 11274
西班牙语 - 玻利维亚 es-bo 0x400A 16394
西班牙语 - 智利 es-cl 0x340A 13322
西班牙语 - 哥伦比亚 es-co 0x240A 9226
西班牙语 - 哥斯达黎加 es-cr 0x140A 5130
西班牙语 - 多米尼加共和国 es-do 0x1C0A 7178
西班牙语 - 厄瓜多尔 es-ec 0x300A 12298
西班牙语 - 危地马拉 es-gt 0x100A 4106
西班牙语 - 洪都拉斯 es-hn 0x480A 18442
西班牙语 - 墨西哥 es-mx 0x080A 2058
西班牙语 - 尼加拉瓜 es-ni 0x4C0A 19466
西班牙语 - 巴拿马 es-pa 0x180A 6154
西班牙语 - 秘鲁 es-pe 0x280A 10250
西班牙语 - 波多黎各 es-pr 0x500A 20490
西班牙语 - 巴拉圭 es-py 0x3C0A 15370
西班牙语 - 萨尔瓦多 es-sv 0x440A 17418
西班牙语 - 乌拉圭 es-uy 0x380A 14346
西班牙语 - 委内瑞拉 es-ve 0x200A 8202
苏图语 sx 0x0430 1072
瑞典语 sv 0x041D 1053
瑞典语 - 芬兰 sv-fi 0x081D 2077
泰语 th 0x041E 1054
土耳其语 tr 0x041F 1055
汤加语 ts 0x0431 1073
乌克兰语 uk 0x0422 1058
乌尔都语 - 巴基斯坦 ur 0x0420 1056
越南语 vi 0x042A 1066
科萨语 xh 0x0434 1076
意第绪语 ji 0x043D 1085
祖鲁语 zu 0x0435 1077

posted @ 2014-08-20 14:45  小鱼1982  阅读(2918)  评论(0编辑  收藏  举报