所以我想使用SetThreadLocale将线程代码页设置为UTF8。到目前为止,我一直在使用atl字符串转换宏的第二个参数,例如“CT2A(szBUF,CP_UTF8)”。但是我希望能够从SetThreadLocale()开始设置一次线程代码页,而不必再次使用转换宏的第二个参数。
我该怎么做呢? SetThreadLocale不会采用像CP_UTF8这样的代码页参数,而只会采用LCID。我应该给SetThreadLocale提供什么参数来实现这一目标?
请记住,我没有特别的语言在想。我得到的字符串可能是日语,韩语,英语等。到目前为止,将CP_UTF8指定为转换宏的第二个参数时,这种混合字符串没有问题。您可能会问:“那为什么不继续使用第二个参数呢?”。答案是:“因为编写此代码的团队成员很容易忘记它。如果使用转换宏的默认1参数版本可以正常工作,那就太好了。”
最佳答案
SetThreadLocale需要语言标识符,但是UTF-8不是语言标识符-它是Unicode编码。 Land ID的目的之一是告诉系统如何处理128-255范围内的ANSI文本。给定一种真实的语言,在处理此类字符时将使用其代码页。 UTF-8(OTOH)是Unicode文本的压缩表示形式。为了创建UTF-8文本,您的输入必须为Unicode。给定ANSI文本,您将只是不知道如何转换上限字符。这是“手动”完成时的方式,为了将ANSI转换为UTF-8,您必须首先使用具有指定代码页的MultiByteToWideChar,然后才能将所得的Unicode字符串转换为UTF-8。
现在,回到您的问题-我会采取另一种方式。如果其他代码页参数对您造成了很大的困扰,请创建一个可以将其隐藏的宏(或继承CT2A类并修复第二个参数)。