国际化开发技术FAQ

来源:互联网 发布:中国著名网络作家列传 编辑:程序博客网 时间:2024/05/21 17:00

什么是国际化开发?

答:指应用程序能够支持不同的语言输入和显示,同时也能够自如的适应不同文化的习俗。

 

字节、字符、字符集和字符集编码的关系?

答:计算机底层处理的最小单位是字节(8 位二进制表示)。

字符是表示一个有意义的符号或文字。

字符集是由一组相关的字符所组成的集合。比如说德文字符集只与德文相关,中文字符集只与中文相关,不会互相包含。

字符集编码是解决字符在计算机中的编码问题。

 

如何将字符集进行分类?

答:字符集编码通常可以分为以下3 种:单字节编码、宽字符编码和多字节字符编码。

    按照c/c++ 习惯,还可以分为:ANSI 字符集(单个/0 字符结尾)和宽字符集。

 

什么是 gb2312 字符集?

答:由原中国国家标准总局发布,198151 日实施,是中国国家标准的简体中文字符集。它收录了汉字及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共7445 个图形字符。

 

什么是 gbk 字符集?

答:GBK 最初是由微软对GB2312 的扩展,也就是CP936 字码表 (Code Page 936) 的扩展(原来的CP936GB 2312-80 一模一样),最初出现于Windows 95 简体中文版中,由于Windows 产品的流行和在大陆广泛被使用,中华人民共和国国家有关部门将其作为技术规范。注意GBK 并非国家正式标准,只是国家技术监督局标准化司、电子工业部科技与质量监督司发布的“技术规范指导性文件”。虽然 GBK 收录了所有Unicode 1.1GB 13000.1-93 之中的汉字,但是编码方式与Unicode 1.1GB 13000.1-93 不同。仅仅是GB 2312GB 13000.1-93 之间的过渡方案。GBK 收录了21886 个符号,它分为汉字区和图形符号区。汉字区包括21003 个字符。

 

什么是 GB18030 字符集?

答: 2000 年的GB18030 取代了GBK1.0 的正式国家标准。该标准收录了27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。现在的PC 平台必须支持GB18030 ,对嵌入式产品暂不作要求。所以手机、MP3 一般只支持GB2312

 

什么是 BIG5 字符集?

答: 大五码(Big5 ),又称为五大码,是使用繁体 中文社群中最常用的电脑汉字字符 标 准,共收录13,060 个中文字,其中有二字为重覆编码,Big5 属中文内码(中文码分为中文内码及中文交换码两类)。Big5 虽普及于台湾、香港与澳门 等繁体中文通行区,但长期以来并非当地的国家标准,而只是业界标准(de facto standard )。倚天中文系统、Windows 等主要系统的字符集都是以Big5 为基准,但厂商又各自增删,衍生成多种不同版本。

    2003 年,Big5 被收录到台湾官方标准的附录当中,取得了较正式的地位。这个最新版本被称为Big5-2003

 

什么是 许盖功 ”问题?如何解决?

答:Big5 是双字节字符集,使用了双 字符 储存方法,以两个字节来安放一个字。第一个字节称为「高位字节」,第二个字节称为「低位字节」。 高位字节 使用了0x81-0xFE 低位字节 使用了0x40-0x7E ,及0xA1-0xFE

Big5 的分区中:

0x8140-0xA0FE

保留给使用者自定义字元(造字区)

0xA140-0xA3BF

标点符号、希腊字母 及特殊符号,
包括在0xA259-0xA261 ,安放了双音节 度量衡 单位用字:-( 兙兛兞兝兡兣嗧瓩糎)-

0xA3C0-0xA3FE

保留。此区没有开放作造字区用。

0xA440-0xC67E

常用汉字,先按笔划 再按部首 排序。

0xC6A1-0xC8FE

保留给使用者自定义字元(造字区)

0xC940-0xF9D5

次常用汉字,亦是先按笔划再按部首排序。

0xF9D6-0xFEFE

保留给使用者自定义字元(造字区)

    如其他DBCS 字符集相同,普通ASCII (小于0x80 )采用一个字节表示,这与双字节的低字节部分有重叠。

    因为低位 字符 中包含了程序 shellscript 中,字串或命令常会用到的特殊字元,例如0x5C “/”0x7C “|” 等。「/ 」 在许多用途的字串中是当作转义符号又称为跳脱 字符 ,例如 /n (换行)、/r (归位)/ttab )、/// 本身符号)、/" (引号)等等。而 「| 」 在UNIX 作业系统中大多当作命令管线的使用,如 "ls -la | more" 等等。如果在字串中有这些特殊的转义字元,会被程序或编译器解释为特殊用途。但是因为是中文的原因,故无法正确解释为上面所述的行为,因此程式可能会忽略此转义符号或是中断执行。若此,就违反了使用者本来要当成中文字元一部份使用的本意。

    在常用字如「功」(0xA55C) 、「-()-(0xB35C) 、「盖」(0xBB5C) 、「育」(0xA87C) 中时常出现,造成了许多软体无法正确处理以Big5 编码的字串或文件。这个问题被戏谑性地人名化,称为「-( 许功盖)- 」或「-( 许盖功)- ( 这三个字都有这种问题)

    一般的解决方法,是额外增加“/” 的字元,因为“//” 会被解释为“/” ,所以 成功/ 因素 这个字串就能无误地被程式当作 成功因素 的字串来处理。 但是额外的困扰是,有些输出功能并不会把“/” 当作特殊字元看待,所以有些程式或网页就会错误地常常出现在「许功盖」这些字后面多了“/”

 

什么是 HKSCS 字符集?

答:HKSCS 是中国香港增补字符集,是以big5 为基础进行扩充的。增加了一些粤语方言字和地名等。

 

什么是 UTF-8 字符集?

答:UTF-88 位元 Universal Character Set Unicode Transformation Format )是一种针对 Unicode 的可变长度字符编码 。它可以用来表示 Unicode 标准中的任何字符,且其编码中的第一个字节 仍与 ASCII 相容,这使得原来处理 ASCII 字符的软件 无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件 网页 及其他储存 或传送文字的应用中,优先采用的编码。

 

什么是 UTF-16 字符集?

答: UTF-16 unicode 的缺省编码方式,不兼容ASCII 码,所有字符都是占用两个字节。存在大小端的问题,一般用于本地存储和显示。

 

什么是 UTF-32 字符集?

答: UTF-32 一般用于UCS-4 ,采用4 字节编码方式,目前很少用到。UTF-32UTF-16 一样存在大小端的问题。

什么是 BOM

答: Unicode 规范中推荐的标记字节顺序的方法是BOMBOM 不是“Bill Of Material”BOM 表,而是Byte Order MarkBOM 是一个有点小聪明的想法:

UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE” 的字符,它的编码是FEFF 。而FFFEUCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输 字符”ZERO WIDTH NO-BREAK SPACE”

这样如果接收者收到FEFF ,就表明这个字节流是Big-Endian 的;如果收到FFFE ,就表明这个字节流是Little-Endian 的。因此字符”ZERO WIDTH NO-BREAK SPACE” 又被称作BOM

UTF-8 不需要BOM 来表明字节顺序,但可以用BOM 来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”UTF-8 编码是EF BB BF 。所以如果接收者收到以EF BB BF 开头的字节流,就知道这是UTF-8 编码了。

 

记事本、 UltraEdit VIM BOM 支持情况如何

答:记事本可以自动识别带不带BOM 的文本文件。

    UltraEdit 如果在高级设置选择了检测UTF-8 ,则指出带BOMutf-8 文件,否则乱码。

    Vim 支持bom 和不带bom ,但是要在配置文件中设置:encoding=cp936 fileencodings=ucs-bom,utf-8,cp936

 

UNICODE _UNICODE 的作用是什么

答: _UNICODE 只是针对 CRT 标准库的 unicode 定义 UNICODE 是针对 win32 api unicode 定义。

这两个宏的作用,就是在编译时把相应的标准接口替换成ansiunicode 版本。

如果定义了这两个宏,vc 会编译成unicode 版本。否则,编译成ansi 版本。

 

 

如何编写 unicode 程序

答:通常有两种方法:

1、   代码写成ansi/unicode ,通过在工程中设置 UNICODE _UNICODE 宏来控制是否支持 unicode

2、   显式定义unicdoe 变量和接口,显式调用宽字符集标准库接口和系统接口。

 

什么是 ANSI/Unicode 程序

答:指同一份代码可以编译成ANSI 版本,也可以编译成Unicode 版本,以便适应不同的需求。

 

如何编写 ANSI/Unicode 程序

答:

1 、字符串变量或参数都定义成 TCHAR LPTSTRLPCTSTR

2 、调用标准库或win32 的通用接口。

3、   通过在工程中设置 UNICODE _UNICODE 宏来控制生成 unicode 代码或ansi 代码。

4、   对于常量字符串通过TEXT 宏来进行自动转换。

 

如何使用 ansi/unicode 通用接口

答:

1、   对于标准库,所有的ansi/unicode 通用接口都在tchar.h 中,每种常规的函数都有对应的通用接口,比如:printf 对应_tprintf

2、   对于win32 api ,调用通用标准接口即可,因为大部分win32 api 都支持ansi/unicode

    比如调用 CreateWindow ,而不是显示调用CreateWindowACreateWindowW

3

 

Windows unicode 的支持情况

答: windows 98 部分支持 unicode windows NT/2k 以后版本在内核中完全支持 unicode 。如果你的程序要在windows 98windows 2k 上同时运行,则最好写成ansi/unicode ,在windows 98 上使用ansi 版本运行。

Windows CE 只支持Unicode ,只能开发纯unicode 应用程序。

 

VC 的资源是否 unicode 对加载资源有什么影响

答: 源编译器对你的所有资源进行编译时,输出文件是资源的二进制文件。资源(字符串表、对话框模板和菜单等)中的字符串值总是写作 Unicode 字符串。在 Windows 98 Windows 2000 下,如果应用程序没有定义 UNICODE 宏,那么系统就会进行内部转换。

       如果在编译源代码模块时没有定义 UNICODE ,调用 LoadString 实际上就是调用 LoadStringA 函数。这时 LoadStringA 就从你的资源中读。

 

如何判断一段文本是否 unicode

答: 通过IsTextUnicode 可以来判断一段文本是否为unicode 文本,它采用的是统计和定性的方法来判断,因此有时会不准。

 

如何遍历和操作 DBCS 字符串

答: crt 中,如_mbslen, 它可以用来操作多字节(既包括单字节也包括双字节)字符串。

                     DBCS 字符串进行操作的帮助函数

函数

描述

PTSTR CharNext(PCTSTR pszCurrentChar);

返回字符串中的下一个字符的地址

PTSTR CharPrev(PCTSTR pszStart,PCTSTR pszCurrentChar);

返回字符串中的上一个字符的地址

BOOL IsDBCSLeadByteTRUE(BYTE bTestChar);

如果该字节是DBCS 字符的第一个字节,则返回

如果是unicode 字符串,则只要移动指针就可以实现对字符串的遍历。

 

常见的字符串类型有哪些

答: 常见数据类型定义

数据类型

等价于

LPTSTR

TCHAR *

LPCTSTR

const TCHAR *

wchar_t

unsigned short

WCHAR

wchar_t

LPWSTR

wchar_t *

LPCWSTR

const wchar_t *

LPSTR

char *

LPCSTR

const char *

OLECHAR

wchar_t

LPOLESTR

wchar_t *

LPCOLESTR

const wchar_t *

 

_T(x) __T(x) _TEXT(x) TEXT(x) 作用是什么?有什么区别?

答: _T(x) __T(x)_TEXT(x)TEXT(x) 作用相同,都是根据是否定义_UNICODE 宏来决定当前字符或字符串x 转换成宽字符串。

如果x 本身就是宽字符串则不做处理。

如果未定义_UNICODE ,则也对x 不做处理。

推荐使用TEXT(x) ,可读性较好,也不用写下划线。

 

L _T(x) __T(x) _TEXT(x) TEXT(x) 有什么区别?

答:L 是明确告诉编译器必须按照宽字符来处理。

    其他几个是条件编译的,由是否定义 UNICODE 宏决定。

 

如何操作 unicode 字符串?

答: Unicode 字符串进行操作的函数

函数

描述

lstrcat

将一个字符串置于另一个字符串的结尾处

lstrcmp

对两个字符串进行区分大小写的比较

lstrcmpi

对两个字符串进行不区分大小写的比较

lstrcpy

将一个字符串拷贝到内存中的另一个位置

lstrlen

返回字符串的长度(按字符数来计量)

    这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode 版本,也可以调用函数的ANSI 版本,这要根据编译源代码模块时是否已经定义了UNICODE 而定。例如,如果没有定义UNICODE lstrcat 函数将扩展为lstrcatA 。如果定义了UNICODE lstrcat 将扩展为lstrcatW

 

如何让 printf 支持 ansi/unicode

答:让_printf 接口来替换printf 即可。

    示例代码:

    TCHAR lpBuffer[_MAX_FNAME];

    _tprintf(TEXT(“%s/n”),lpBuffer);

 

在字符串操作函数中如何处理 ansi unicode 字符串?

答: 如果在定义了_ UNICODE 的情况下编译你的源代码模块,那么printf 函数家族便希望所有字符和字符串参数代表Unicode 字符和字符串。但是,如果在没有定义_UNICODE 的情况下编译你的源代码模块,printf 函数家族便希望传递给它的所有字符和字符串都是ANSI 字符和字符串。

char szA[100];             //An ANSI string buffer

WCHAR szW[100];            //A Unicode string buffer

 

//Normal sprintf:all strings are ANSI

sprintf(szA, "%s","ANSI Str");

 

//Converts Unicode string to ANSI

sprintf(szA,"%S",L"Unicode Str");

 

//Normal swprintf:all strings are Unicode

swprintf(szW,L"%s",L"Unicode Str");

 

//Converts ANSI string to Unicode

swprintf(szW,L"%S", "ANSI Str");

 

vc6 中为什么编译 MFC unicode 程序会出错,如何处理?

答: vc6 缺省安装的MFC 不支持unicode ,必须在安装时选择支持多语言或全部安装。否则,会出现LINK : fatal error LNK1104: cannot open file "mfc42ud.lib" 的错误。

 

什么情况下要用到资源 DLL

答:如果要想使UI 与逻辑分离,则制作资源DLL 是比较好的方法。

    好处有:

1、   UI 可以独立于逻辑,独立更新和升级。

2、   如果要开发多语言应用程序,不同语言的UI 只需要不同的资源DLL 即可,逻辑部分代码不需要做任何改动。

 

如何制作 win32 资源 DLL

答: 因为win32 程序中代码和资源没有直接的联系,因此可以先设计UI 及其他资源并生成DLL ,然后在exe 程序中动态加载资源DLL

 

    实现步骤 (以vc6 为例,一个简单的文本编辑器示例):

1、   创建一个win32 DLL 的工程,工程名称为“NotePadRes ”,选择“a simple DLL project ”,点击finish

2、   创建一个空的资源脚本文件,如MyNotePad.rc ,然后在ResourceView 中就会出现“MyNotePad resources ”目录。

3、   ResourceView 中的“MyNotePad resources ”目录上右键插入资源,设置资源ID 并编辑资源。在本示例中,我插入了图标、菜单和快捷键资源,你也可以插入其他资源(如位图、字符串表、对话框、鼠标等)。

    注意:在你编辑资源时,vc 编译器会自动修改rc 文件,并且生成resource.h 文件。

4、   编辑好资源后,编译DLL ,输出NotePadRes.dll

5、   创建一个win32 application 的工程,工程名称为“MyNotePad ”,选择“a simple win32 application ”,点击“完成”。

6、   为了使用资源DLL 中的UI 资源,我们必须在创建窗口之前加载资源DLL ,因此在WinMain 的最开始处使用LoadLibrary 动态加载NotePadRes.dll

7、   使用加载DLL 作为参数,加载菜单、快捷键和图标。注意:在注册窗口类别时把菜单名称设置为NULL ,而在创建窗口时把加载好的菜单句柄传进去。这是windows 创建个性化菜单的一种手段,让相同类别的窗口可以有不同的菜单。

8、   拷贝NotePadRes 项目生成的resource.hMyNotePad 的代码目录,并且在MyNotePad.cpp 中引用该头文件,这样就可以使用NotePadRes 中的资源ID

9、   MyNotePad.cpp 中实现菜单和快捷键的响应代码,我这里只是为了演示如何分离代码和资源,因此很多菜单的响应代码都没有实现。

10、               编译MyNotePad

11、               拷贝NotePadRes.dllMyNotePad 项目的输出目录。

12、               执行MyNotePad.exe ,观察演示效果。

 

 

如何制作 MFC 资源 DLL

答: MFC 程序是通过clw 文件来建立资源与代码的联系,clw 文件是在设计资源框架并通过ClassWizard 添加接口时产生,由vc 编译器维护,手工编写比较麻烦。

    另外,ClassWizad 不允许项目不包含资源文件。

    因为mfc 的代码和资源关系比较密切,因此分离起来比win32 麻烦。

    一般MFC 程序资源和代码分离的方法分为以下几大步:1 、建立原型程序,完成所有UI 设计及相应的接口框架。2 、编译原型程序,并把rc 文件从原型中移出。3 、根据原型的rcresource.h 文件构建资源DLL ,并在此基础上进行修改。4 、在原型中载入资源DLL

 

实现步骤 (以vc6 为例,一个单文档文本编辑器示例):

1 、创建一个MFC AppWizard(exe) 工程,工程名称为“MyNotePad ”,选择“Simple Document ”,语言选择中文,点击finish

2 、为了实现动态加载资源,则必须使用资源DLL 的句柄来取代MFC 缺省的资源句柄,MFC 缺省的资源是编译在exe 中的。在CMyNotePadApp 中添加保护或私有变量m_hLangDLL 来保存资源DLL 句柄,在InitInstance 中加载资源DLL 并替换MFC 缺省资源句柄,在ExitInstance 中释放资源DLL

注意: InitInstance ExitInstance 都是虚函数,但是ExitInstance 在子类中没有实现,需要在CMyNotePadApp 定义虚函数并实现。

3 、为了说明是从资源链接库中动态地获取数据而不是从程序的执行体中获取,该程序从资源链接库中获取了一个图标和一个字符串,并绘制在文档显示区域。代码在CMyNotePadView::OnDraw 中实现。

    字符串IDIDS_WELCOME=300 ,内容为”hello world” ,我们在后面的资源DLL 中改为其他内容,以证实是从资源DLL 中加载的。

    图标也在资源DLL 中做修改,比如在图标中添加一个红色的“中”字,以示区别于原来的图标。

4 、编译运行MyNotePad 工程。由于资源DLL 还未创建,运行时会出现" 无法装载资源链接库!" 错误提示。

5 、从MyNotePad 工程移出MyNotePad.rc 文件,并不从硬盘上删除,因为后面构建资源DLL 时要以此资源描述文件为基础。

6 、创建一个MFC AppWizard(DLL) 的工程,工程名称为“NotePadRes ”,选择“Regular DLL using shared MFC DLL ”,点击finish

7 、把NotePadRes.rcresource.hNotePadRes 工程中移出,并且从硬盘上删除NotePadRes.rcresource.h 以及res 目录下的所有文件。

8 、从MyNotePad 工程目录中拷贝MyNotePad.rcresource.hNotePadRes 工程目录下,并且把MyNotePad 工程的res 目录下所有文件都拷贝到NotePadRes 工程的res 目录下。

9 、把MyNotePad.rc 重命名为NotePadRes.rc 。根据个人喜好,此步可以不做,不影响正确性。

10 、在NotePadRes 工程中添加刚才拷贝的所有文件。

11 、修改字符串和图标。

12 、在工程的setting->Resources 的预处理中删除_AFXDLL ,使用户的链接库包含通用的MFC 资源。否则,应用程序会从系统安装的MFC 动态链接库中收集通用的MFC 资源,应用程序特定资源会被本地化。

13 、如果是制作其他语言版本的资源DLL ,还需要在setting->Resources 把语言改一下。

14 、在setting->link 的编译选项中添加“/NOENTRY ”选项,表示输出的为纯资源DLL

15 、编译NotePadRes ,设置输出chinese.dll 资源DLL

16 、拷贝chinese.dllMyNotePad 的输出目录。

17 、运行MyNotePad.exe ,观察演示效果。

 

两种非 unicode 字符集如何转换?

答: 两种非unicode 字符集转换方法,先把其中一种字符集转换为unicode ,然后把unicode 字符集转换为另外一种字符集。比如gb2312utf-8 转换,先把gb2312 转换为unicode ,然后把unicode 转换为utf-8

 

如何转换转换 gb2312/gbk unicode

答: int GbkTowchar(LPCSTR lpMultiByteStr,LPWSTR & lpWideCharStr,int & cchWideChar)

{

   //revert utf8 string to wchar string

    cchWideChar =            MultiByteToWideChar(CP_ACP,0,lpMultiByteStr,strlen(lpMultiByteStr),NULL,0);

    lpWideCharStr = new WCHAR[cchWideChar + 1];

   memset(lpWideCharStr,0,sizeof(WCHAR) * (cchWideChar + 1));

   MultiByteToWideChar(CP_ACP,0,lpMultiByteStr,strlen(lpMultiByteStr),lpWideCharStr,cchWideChar);

  

   return cchWideChar;

}

 

// 使用转换后pwStr 宽字符串

delete []lpWideCharStr;// 释放宽字符串内存

 

如何转换转换 unicode utf-8

答: int wcharToUTF8(LPCWSTR lpWideCharStr,LPSTR & lpMultiByteStr,int & cchMultiByte)

{

    //revert wchar string to utf8 string

    cchMultiByte = WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,0,NULL,NULL);// 获取转换成多字节字符串所需要的内存

    lpMultiByteStr = new char[cchMultiByte + 1];

    memset(lpMultiByteStr,0,cchMultiByte + 1);

    WideCharToMultiByte(CP_UTF8, 0, lpWideCharStr, sizeof(WCHAR) * wcslen(lpWideCharStr), lpMultiByteStr,cchMultiByte,NULL,NULL);

   

    return cchMultiByte;

}

    // 使用转换后的字符串

    Delete []lpMultiByteStr;// 释放多字节字符串内存

 

MySQL 字符集类型有哪些?

答: 类型:主机字符集、数据库字符集、表字符集、列字符集、连接字符集。

关系:主机字符集 > 数据库字符集 > 表字符集 > 列字符集,当下一级字符集未指定时,以上级字符集为准。

 

 

MySQL 的各种字符集转换关系是什么?

答:1 、发送请求。

    1) 客户端发送请求到服务器端。

   2) 服务器端会把请求的数据从客户端字符集(character_set_client) 转成服务器连接字符集(character_set_connection)

   3) 然后服务器会检测存储区域(tablecolumn) 的字符集,然后把数据从连接字符集(character_set_connection) 转为存储区域(tablecolumn) 的字符集,然後再存储或者查询。

2 、返回请求。

  1) 服务器将存储区域(tablecolumn) 的字符集转换成服务器连接字符集(character_set_connection)

  2) 将服务器连接字符集(character_set_connection) 转换成结果字符集(character_set_results) ,再发送到客户端。

 

MySQL 字符集 Uincode 支持情况如何?

答: 1 、服务器端支持 UCS-2 Unicode UTF-16 )和 UTF-8

       2 、客户端只支持 UTF-8

     3 、在 4.1 之前的客户端不支持 UTF-8

 

如何设置 MySQL 连接字符集?

答:有两种方法:

1、   在建立MySQL 连接前,设置MySQL 连接句柄属性:

    mysql_options(m_mysql_handle, MYSQL_SET_CHARSET_NAME, charset);

2、   建立好MySQL 连接,在执行所有SQL 语句前:

    set names ‘ 字符集’;

 

国际化开发的协议字符串最好采用什么字符集?

答:最好使用UTF-8 ,原因是UTF-8 比较适合网络传输,而且很方便的与其他字符集进行转换。

 

国际化开发的数据库最好采用什么字符集?

答:数据库的字符集最好采用UTF-8 ,理由同上。

    另外,数据库迁移时比较方便,不用考虑字符集转换的问题,不会产生乱码。

 

为什么 MySQL 数据库已经使用了 UTF-8 ,但是查询出来的结果还是乱码?

答:数据库连接字符集和写数据库的字符集必须相同,否则就会出现无法转换的问题,这是乱码的根源。具体如何转换,前面有专门说明。

 

国际化开发的日志文件和配置文件采用什么字符集比较好?

答:建议采用带BOMUTF-8 编码。

    理由如下:

1、   可以支持多种语言。

2、   没有字节序的问题,unicode 有字节序的问题,需要另外处理。

3、   大多数文本或配置文件解析工具都支持utf-8

 

Linux 服务器国际化开发采用什么方案比较好?

答:

方案一:

    1 、日志和配置文件都采用utf-8 存储(带BOM )。

2 、网络协议字符串采用utf-8 字符集。

3、   读写数据库采用utf-8 字符集。

4、   如果需要对字符串进行遍历或修改,则把它转换成unicode 处理,处理完成后再转换成utf-8

5

此方案的好处是不用考虑字节序问题,缺点是对字符串进行处理不太方便,要做转换。

 

方案二:

    所有的文件和网络I/O 及数据库都采用unicode ,文件存储带BOM ,不过网络协议中的字符串要指明字节序(或都转换成网络字节序),这是它的不足之处。

    此方案的好处是所有字符串都可以直接处理,不用转换。

    缺点是网络协议中要指明字节序或转换成网络字节序。

 

 

记事本中如何输入并显示韩文?

答:打开控制面板-区域和语言选项-语言-详细信息-添加-输入语言选朝鲜语-确定。这个步骤就是让你有了系统自带的韩文输入法,你按 alt+shift 或者 ctrl+shift 就可以把这个韩文输入法调出来了。

然后,打开记事本-格式-字体,接着,字体( F) 那里选 BatangChe ,字符集那里选“韩文”,确定。好了你现在可以调出你的韩文输入法在记事本上输韩文了。但是当你想保存的时候就有个提醒,如果你点“是”,保存了,再次打开的时候,那些韩文会乱码。如果点“否”,就不能保存。那有没有什么方法保存呢,请看第三步。

第三步,点记事本的文件-另存为,在编码那里选 Unicode utf-8 ,保存。现在你打开另存为的那个记事本,韩文没变乱码。成功了,你甚至可以把文件名都改为韩文呢。

 

 

如何处理中文、泰文和阿拉伯文的字符消息?

答:由于中文字符编码一般都是gb2312GBK ,由一个或两个输入字符组成,但是只显示一个字符。

    泰文和阿拉伯文都每输入一个字符就显示一个字符。

    处理办法:

1、   中文版本中,收到字符后判断最高位是否为1 ,即是否大于127 ,证明是有两个字符组成的汉字。否则,就是ASCII 码字母或数字。

2、   泰文或阿拉伯文版本,每收到一个wm_char 消息就显示到屏幕上。

 

如何处理多语言界面字体显示乱码?

答:尽管把字符串变成了unicode ,但是有时仍然是显示乱码,原因是字体设置不正确。比如让中文字体显示泰文,或者反之,都不可能正常显示的。

处理方法有两种:

1、   设置一种比较通用的字体,比如Arial Unicode MS ,此种方法一般用在支持换语言皮肤的应用程序中。

2、   根据不同语言设置不同的典型字体,比如对于简体中文,设置仿宋体等肯定能够正常显示。

3 、方法一的字体不是非常美观,而且对于没有编入unicode 的字符无法显示。

 

原创粉丝点击