4

所以我想使用 SetThreadLocale 将线程代码页设置为 UTF8。到目前为止,我一直在使用 atl 字符串转换宏的第二个参数,例如“CT2A(szBUF, CP_UTF8)”来执行此操作。但是我希望能够在开始时使用 SetThreadLocale() 设置一次线程代码页,而不必再次使用转换宏的第二个参数。

我该怎么做呢?SetThreadLocale 不会采用像 CP_UTF8 这样的代码页参数,而只是一个 LCID。我应该提供哪些参数 SetThreadLocale 来实现这一点?

请记住,我没有特别的语言。我得到的字符串可能是日语、韩语、英语等。到目前为止,在将 CP_UTF8 指定为转换宏的第二个参数时,我对这种字符串组合没有任何问题。您可能会问“那么为什么不继续使用第二个参数”。回答,“因为处理代码的团队成员很容易忘记它。如果它能够使用转换宏的默认 1 参数版本正常工作,那就太好了。”

4

1 回答 1

5

SetThreadLocale 需要语言标识符,但 UTF-8 不是语言标识符 - 它是 Unicode 编码。土地 ID 的目的之一是告诉系统如何处理 128-255 范围内的 ANSI 文本。给定一种真实语言,在处理此类字符时将使用其代码页。UTF-8,OTOH,是 Unicode 文本的压缩表示。为了创建 UTF-8 文本,您的输入必须是 Unicode。给定 ANSI 文本,您只是不知道如何转换字符的上限。这是“手动”完成的方式,为了将 ANSI 转换为 UTF-8,您必须首先使用具有指定代码页的 MultiByteToWideChar,然后才能将生成的 Unicode 字符串转换为 UTF-8。

现在,回到你的问题——我会走另一条路。如果附加的代码页参数让您感到非常困扰,请制作一个隐藏它的宏(或继承 CT2A 类并修复第二个参数)。

于 2009-06-29T18:33:08.963 回答