如何让wcsftime在Visual Studio CRT中工作?

时间:2014-01-07 11:57:37

标签: windows visual-studio unicode localization msvcrt

Visual Studio CRT附带的wcsftime的实现似乎有一个完全令人难以置信的错误!据我所知,它只是不支持unicode。

在内部,它转换为单字节(使用当前的单字节代码页),然后调用strftime,然后返回到多字节。真是笑话!如果它不比狭窄的版本好,它们为什么要发行宽版?

如果我拨打wcsftime(L"ümlaut ş"),则变音符号有效(因为它包含在Latin-1中),但s-cedilla不会(它出现为L"ümlaut ?")。

我想要的只是编写一个返回UTF-8数据的wcsftime包装器,但我似乎无法从wcsftime中获取全部Unicode(更不用说{{1}无论我做什么,我都会这样做。

这些功能是否在CRT中根本被打破?为了让strftime格式字符串在我的跨平台应用程序中运行,我是否必须提供自己的实现?

2 个答案:

答案 0 :(得分:1)

这是wcsftime的一个已知问题,您不应该使用非选定语言环境格式的字符格式化日期和时间。您也可以尝试使用GetDateFormat / GetTimeFormat函数,但我不确定它们是否可以按您的需要运行。其他解决方案是在调用wcsftime之前将所有字符编码为十六进制(例如“ş”< - >“@ 015E”),并在调用它之后进行解码。

答案 1 :(得分:0)

为了记录,我的解决方案是实现我自己的strftime(将其添加到我已经在Windows上重新实现的14组ISO C函数的列表中)。我的strftime正确使用区域设置,采用UTF-8格式字符串,并使用直接从GetLocaleInfoExGetDateFormatW获得的数据适当地替换标记,这与损坏的CRT版本不同。叹息。