最近试图用C++ 直接调用mysql 的内嵌服务器来管理大量数据,遭遇到了许多字符串国际化问题,现记录在此。
要注意的关键点是:
1. C++语言中的 L"" 代表宽字符,但不一定代表Unicode字符。字符的内容取决于你把C++文件按什么编码来保存。
2. Unicode是一个太过于笼统的说法,极易引起歧义。以下多种编码都可以叫Unicode:utf8, ucs2, ucs2 (big endian), Unicode 32.
3. 一旦选择了某种编码,就要在程序中任何地方都保持一致。
4. 即使在程序中采用宽字符 (16bit),也不能确保一个字符就对应一个文字。某些语言的文字可能占据4个字节。
5. mysql可以精确控制在客户端、传输、服务器、数据库层级的编码设置。所有的编码必须一致,否则就会在转换过程中出现信息丢失从而看到?符号。
在我的实际例子中,我的程序全部采用的是ucs2编码,而在mysql端全部采用utf8编码。
Mysql中:
create database database_name character set utf8;
alter database database_name character set utf8;
C++中:
mysql_options(mpMySql, MYSQL_SET_CHARSET_NAME, "utf8");
mysql_set_character_set(mpMySql, "utf8");
要注意的关键点是:
1. C++语言中的 L"" 代表宽字符,但不一定代表Unicode字符。字符的内容取决于你把C++文件按什么编码来保存。
2. Unicode是一个太过于笼统的说法,极易引起歧义。以下多种编码都可以叫Unicode:utf8, ucs2, ucs2 (big endian), Unicode 32.
3. 一旦选择了某种编码,就要在程序中任何地方都保持一致。
4. 即使在程序中采用宽字符 (16bit),也不能确保一个字符就对应一个文字。某些语言的文字可能占据4个字节。
5. mysql可以精确控制在客户端、传输、服务器、数据库层级的编码设置。所有的编码必须一致,否则就会在转换过程中出现信息丢失从而看到?符号。
在我的实际例子中,我的程序全部采用的是ucs2编码,而在mysql端全部采用utf8编码。
Mysql中:
create database database_name character set utf8;
alter database database_name character set utf8;
C++中:
mysql_options(mpMySql, MYSQL_SET_CHARSET_NAME, "utf8");
mysql_set_character_set(mpMySql, "utf8");