我见过C++社区中的很多人(特别是freenode上的## c ++)对windows api 的使用wstrings和使用感到不满wchar_t.究竟是什么"错误"有wchar_t和wstring,如果我要支持国际化,有一些什么替代宽字符?
有没有一种标准的方法来使用unicode字符串文件路径进行fopen?
标准中间接禁止使用可变长度编码.
所以我有几个问题:
如何处理标准的以下部分?
17.3.2.1.3.3宽字符序列
宽字符序列是一个数组对象(8.3.4)A,可以声明为TA [N],其中T是wchar_t(3.9.1)类型,可选择由const或volatile的任意组合限定.数组的初始元素定义了内容,包括由某个谓词确定的元素.字符序列可以由指定其第一元素的指针值S指定.
NTWCS的长度是终止空宽字符之前的元素数.空NTWCS的长度为零.
问题:
basic_string<wchar_t>
operator[]实施以及它返回了什么?
If pos < size(), returns data()[pos]. Otherwise, if pos == size(), the const version returns charT(). Otherwise, the behavior is undefined.size()返回元素的数量还是字符串的长度?
Returns: a count of the number of char-like objects currently in the string.resize()工作怎么样?
insert(),erase()和其他处理?cwctype
cwchar
getwchar() 显然无法返回整个平台 - 角色,那么这是如何工作的?加上所有其余的角色功能(主题是相同的).
编辑:我将打开奖金以获得一些确认.我希望得到一些明确的答案或至少更明确的投票分配.
编辑:这开始变得毫无意义.这充满了完全相互矛盾的答案.你们有些人谈论外部编码(我不关心那些,UTF-8编码仍然会被存储为UTF-16一旦读入字符串,输出相同),其余只是相互矛盾.: - /
我们可以在Unix编译器中使用wmain()函数,还是只在\ for windows上使用?
使用printf将双字节字符串格式化为单字节字符串时:
printf("%ls\n", L"s:\\??????Hello"); // %ls for a wide string (%s varies meaning depending on the project's unicode settings).
Run Code Online (Sandbox Code Playgroud)
显然,有些字符不能表示为ascii字符,所以有时我看到双字节字符变成'?'的行为.标记字符.但是,这似乎取决于特定的角色.对于上面的printf,输出是:
s:\
Run Code Online (Sandbox Code Playgroud)
我希望我可以得到类似的东西:
s:\??????Hello
Run Code Online (Sandbox Code Playgroud)
我担心我已经失去了这个例子,但是当我遇到unicode字符时,我想一个字符串,用'?'替换第一个字符串 然后放弃了其余的.
所以,我的问题是,当您将宽字符串格式化为单字节字符串时应该发生什么.这里的文档:http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx说"字符显示到第一个空字符".但是,我没有看到.这是printf中的一个错误,还是我在某处记录的行为,如果有的话,在哪里.
谢谢你的帮助.
UPDATE
感谢人们给我替代使用printf的答案.我将改为另类,但出于好奇,我真的很感兴趣为什么printf没有可靠的记录行为.看起来好像它的实现者竭尽全力使它不起作用.
我正在使用VisualStudio和MFC在C++中编程(只是偶尔).我用fopen和fprintf写了一个文件.该文件应以UTF8编码.有没有可能这样做?无论我尝试什么,该文件都是双字节unicode或ISO-8859-2(latin2)编码.
Glanebridge
我正在尝试调用printf()以使用 输出 Unicode 字符/字符串%s,但它不打印任何内容。
如果我这样调用printf():
printf("\xE2\x98\xA0")
Run Code Online (Sandbox Code Playgroud)
我得到一个?.
但是,如果我这样使用%ls:
printf("%ls", "?") /* or */
printf("%ls", L"?") /* or */
printf("%ls", L"\xE2\x98\xA0")
Run Code Online (Sandbox Code Playgroud)
我什么也没打印;
另外,如何声明一个wchar_t包含 Unicode 字符的字符串? wchar_t wstro[50] = L"?"不起作用。
我需要malloc()一个wchar_t在它然后把Unicode数据?
我有办法在 Windows 上的 Rstudio 中更改控制台编码吗?
这不是关于以特定编码读取文件或获取脚本,而是关于更改控制台编码(编码 Sys.getlocale 产生)。
这通常不是什么大问题,但我尝试创建一个包,并且我在某些字符串和符号中使用了德语变音符号。编码roxygen2效果最好,UTF-8但covr如果源文件不在控制台/系统编码中,则会出现错误。
(如果有解决方法roxygen2和covr问题,这也会有所帮助。附加信息:我covr::package_coverage从控制台调用,我roxygen2通过 Rstudios Build 命令调用。)
和会话信息:
sessionInfo()
# R version 3.4.2 (2017-09-28)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows >= 8 x64 (build 9200)
#
# Matrix products: default
#
# locale:
# [1] LC_COLLATE=German_Austria.1252 LC_CTYPE=German_Austria.1252 LC_MONETARY=German_Austria.1252 LC_NUMERIC=C LC_TIME=German_Austria.1252
Run Code Online (Sandbox Code Playgroud)
更新:通过 Rstudio 中的文件获取出错的函数,加载devtools::load_all(".")和 RStudio gui 给出错误/错误的编码。
我想显示\xe2\x88\x9e具有 Unicode 的无穷大符号U+221E。我目前正在使用fmt库,它应该有很多支持并且是跨平台的。
fmt::print("", fmt::styled("\xe2\x88\x9e >", fmt::emphasis::bold | fg(fmt::color::aquamarine)));\nRun Code Online (Sandbox Code Playgroud)\n我得到以下输出:
\n? >\nRun Code Online (Sandbox Code Playgroud)\n我也尝试过设置:setlocale(LC_ALL, "en_US.UTF-8");没有帮助。我使用的是 Windows 11 x64。
警告:
\nwarning C4566: character represented by universal-character-name \'\\u221E\' cannot be represented in the current code page (1252)\nRun Code Online (Sandbox Code Playgroud)\nMS Visual Studio 2022 IDE。
\n我应该在项目属性中更改字符集吗?当前设置为:使用 Unicode 字符集,第二个选项是:使用多字节字符集。
\n使用 WinAPI 时,经常使用的类型是 wchar_t,但是我偶然发现许多消息来源说 wchar_t 不应该在其他平台上使用,因为它没有标准化(某些平台上的 UTF-16,UTF-32)对他人等)。如果 wchar_t 没有标准化,是否有一种类型(最好是 UTF-16)可以在 Windows、MacOS 和 Linux 上可靠地使用,并且与 WinAPI 兼容,或者有任何其他方式来确保可移植性?