Visual Studio CRT附带的wcsftime
的实现似乎有一个完全令人难以置信的错误!据我所知,它只是不支持unicode。
在内部,它转换为单字节(使用当前的单字节代码页),然后调用strftime
,然后返回到多字节。真是笑话!如果它不比狭窄的版本好,它们为什么要发行宽版?
如果我拨打wcsftime(L"ümlaut ş")
,则变音符号有效(因为它包含在Latin-1中),但s-cedilla不会(它出现为L"ümlaut ?"
)。
我想要的只是编写一个返回UTF-8数据的wcsftime
包装器,但我似乎无法从wcsftime
中获取全部Unicode(更不用说{{1}无论我做什么,我都会这样做。
这些功能是否在CRT中根本被打破?为了让strftime
格式字符串在我的跨平台应用程序中运行,我是否必须提供自己的实现?
答案 0 :(得分:1)
这是wcsftime的一个已知问题,您不应该使用非选定语言环境格式的字符格式化日期和时间。您也可以尝试使用GetDateFormat
/ GetTimeFormat
函数,但我不确定它们是否可以按您的需要运行。其他解决方案是在调用wcsftime之前将所有字符编码为十六进制(例如“ş”< - >“@ 015E”),并在调用它之后进行解码。
答案 1 :(得分:0)
为了记录,我的解决方案是实现我自己的strftime
(将其添加到我已经在Windows上重新实现的14组ISO C函数的列表中)。我的strftime
正确使用区域设置,采用UTF-8格式字符串,并使用直接从GetLocaleInfoEx
和GetDateFormatW
获得的数据适当地替换标记,这与损坏的CRT版本不同。叹息。