Windows 上的 Unicode 基础知识
Posted
技术标签:
【中文标题】Windows 上的 Unicode 基础知识【英文标题】:Unicode Basics on Windows 【发布时间】:2009-02-11 09:42:53 【问题描述】:我有一个 C++ 库,我将它提供给其他开发人员。其中一个需要 i18n,所以他问我是否可以在 API 中的字符串中添加 L 前缀。
我对 i18n 了解不多,所以我有一些基本问题:
当我用 Unicode 编译我的库时,其他开发人员可以像往常一样使用这个构建吗?或者开发人员是否也应该更改他们的 Visual Studio 设置以使用 unicode?p>
当我使用 Unicode 编译我的库时,是否需要更改头文件和 .cpp 文件中的所有字符串?或者在头文件的字符串中添加 L 前缀就足够了吗?
提前致谢!
保罗
【问题讨论】:
【参考方案1】:添加 L 前缀会将字符串从 char
数组更改为 short
数组。更好的选择是用“TEXT”宏包装所有字符串,即
TEXT("My string")
如果您的构建是 Unicode 构建,则您的所有字符串都将成为 short
s 的数组,但如果不是,它们将保留为 char
s 的数组。 Windows 还提供以下类型:
LPWSTR = short *
LPTSTR = short *, or char * if UNICODE not defined
LPSTR = char *
不要忘记;即使您在字符串中添加了 L 前缀或包装了 TEXT
,您也需要确保调用了正确的函数。如果定义了 UNICODE
,标准 Windows 字符串 API(例如 lstrlen
)会自动从 char *
切换到 short *
,但您需要确保您没有使用仅使用 char *
的函数。
您的库导出的使用字符串的函数也会破坏使用您的库的旧应用程序,因为这些应用程序仍将传递char
s 而不是short
s 的数组,因此您可能想要使用那里有某种向后兼容性。
【讨论】:
L 前缀使字符串成为 wchar_t 数组,而不是短的。混淆可能来自这样一个事实,在旧的 MSVC6 中,wchar_t 不是本机类型,而只是简写的 typedef(或者它是 unsigned short?) wchar_t 在 MSVC 2008 中仍然是 unsigned short 的 typedef。查看 crtdefs.h。 有一个编译器选项可以将 wchar_t 转换为基本类型 msdn.microsoft.com/en-us/library/dh8che7s(VS.71).aspx,如果我没记错的话,这是自 VS 2005 以来的默认设置。 使用 typedef 的目的是让您可以编写不了解底层类型的代码。【参考方案2】:对国际化 (i18n) 的支持远不止 Unicode。在我的脑海中,有:
货币 数字表示 文本编码(部分通过使用 Unicode 进行抽象) 从右到左的脚本 文本翻译机制其中大部分都可以通过 Window 上的 APIs 以某种形式获得,无论是 Win32 还是 .Net 等。我建议你看看:
Microsoft .Net Internationalization The Microsoft Win32 Internationalization Checklist【讨论】:
以上是关于Windows 上的 Unicode 基础知识的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu上的库ICU不希望从Unicode转换为windows-1251
java基础类型中的char和byte的辨析及Unicode编码和UTF-8的区别
如何获得完整的 unicode 支持,包括 VCL 控件中的中文字符或 XP 上的 Windows 通用控件,就像在 Win7 中一样