【问题标题】:SetThreadLocale and UTF8SetThreadLocale 和 UTF8
【发布时间】:2010-11-06 18:28:02
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ utf-8 atl


    【解决方案1】:

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

    现在,回到你的问题 - 我会换一种方式。如果额外的代码页参数让您感到如此困扰,请创建一个隐藏它的宏(或继承 CT2A 类并修复第二个参数)。

    【讨论】:

    • 这个解释很有道理,谢谢。是的,我想我只是要使用第二个参数。似乎不是为线程设置一次代码页的简单方法。
    猜你喜欢
    • 2017-06-28
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2015-09-22
    • 2010-10-02
    • 1970-01-01
    相关资源
    最近更新 更多