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 构建,则您的所有字符串都将成为 shorts 的数组,但如果不是,它们将保留为 chars 的数组。 Windows 还提供以下类型:

LPWSTR = short *

LPTSTR = short *, or char * if UNICODE not defined

LPSTR = char *

不要忘记;即使您在字符串中添加了 L 前缀或包装了 TEXT,您也需要确保调用了正确的函数。如果定义了 UNICODE,标准 Windows 字符串 API(例如 lstrlen)会自动从 char * 切换到 short *,但您需要确保您没有使用仅使用 char * 的函数。

您的库导出的使用字符串的函数也会破坏使用您的库的旧应用程序,因为这些应用程序仍将传递chars 而不是shorts 的数组,因此您可能想要使用那里有某种向后兼容性。

【讨论】:

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的区别

如何枚举 Windows 8 上的媒体基础转换

如何获得完整的 unicode 支持,包括 VCL 控件中的中文字符或 XP 上的 Windows 通用控件,就像在 Win7 中一样

计算机基础:今天一次把 Unicode 和 UTF-8 说清楚

python基础篇----字符串unicode