问题标签 [wchar-t]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1317 浏览

c++11 - 用 char16_t 数组向上

有什么办法可以做得很好。当我尝试使用 Boost'sto_upper()时,我得到一个std::bad_cast,所以我以这样的方式结束:

我什至不确定这是否正确,因为我不知道是否可以保证to_upperofchar16_t与原始字符具有相同的大小。而且我不确定这是否会导致下一个字符被覆盖或再次读取最后一个进动的后半部分。很抱歉我的愚蠢问题,但是当涉及到具有可变长度编码的随机访问和 char 类型时,我遇到了问题。

0 投票
5 回答
31060 浏览

c++ - 将 wchar_t 转换为 int

如何将 ( ) 转换为( wchar_t)'9'形式的数字?int9

我有以下代码检查是否peek是数字:

我可以减去'0'还是有一些我应该担心的 Unicode 细节?

0 投票
2 回答
263 浏览

c - C 宽字符 - 如何使用它们?

我可以使用以下代码输出单个字符:

如何调整代码以输出字符串?

就像是

0 投票
1 回答
18982 浏览

c++ - 将 wchar_t 转换为字符串?

我有一个wchar_t我想转换为一个string. 然后应该使用 读取字符串stringstream。我已经在这里转换了它:http: //msdn.microsoft.com/en-us/library/ms235631 (v=vs.80).aspx但它们都没有返回任何可用的stringstream. 我对编码不是很有经验,所以我可能遗漏了一些非常简单的东西。

提前致谢!

0 投票
2 回答
1134 浏览

c - 从 wsprintf 获取格式化字符串的长度

使用标准char*字符串时,snprintfandvsnprintf函数将返回输出字符串的长度,即使该字符串由于溢出而被截断。*似乎 ISO C 委员会在添加swprintfand时不喜欢这个功能vswprintf,它返回 -1在溢出。

有谁知道可以提供这个长度的函数?我不知道潜在字符串的大小。我可能要求太多,但是..我宁愿不:

  • 分配一个巨大的静态临时缓冲区
  • 迭代地分配和释放内存,直到找到适合的大小
  • 添加一个额外的库依赖
  • 编写我自己的格式字符串解析器

*我意识到 MSVC 不这样做,而是提供scprintfandvscprintf函数,但我正在寻找其他编译器,主要是 GCC。

0 投票
4 回答
13468 浏览

c++ - WChars、编码、标准和可移植性

以下可能不符合 SO 问题;如果超出范围,请随时告诉我离开。这里的问题基本上是,“我是否正确理解了 C 标准,这是正确的处理方式吗?”

我想就我对 C(以及 C++ 和 C++0x)中字符处理的理解要求澄清、确认和更正。首先,一个重要的观察:

可移植性和序列化是正交的概念。

可移植的东西是像 C, unsigned int, wchar_t. 可序列化的东西是uint32_tUTF-8 之类的东西。“可移植”意味着您可以重新编译相同的源代码并在每个支持的平台上获得工作结果,但二进制表示可能完全不同(甚至不存在,例如 TCP-over-carrier pigeon)。另一方面,可序列化的东西总是具有相同的表示形式,例如我可以在 Windows 桌面、手机或牙刷上读取的 PNG 文件。可移植的东西是内部的,可序列化的东西处理 I/O。可移植的东西是类型安全的,可序列化的东西需要类型双关。</序言>

当谈到 C 中的字符处理时,有两组分别与可移植性和序列化相关:

  • wchar_t, setlocale(), mbsrtowcs()/ wcsrtombs()C 标准没有提到“编码”;事实上,它与任何文本或编码属性完全无关。它只说“你的入口点是main(int, char**);你得到一个wchar_t可以保存系统所有字符的类型;你得到读取输入字符序列并将它们变成可用的 wstrings 的函数,反之亦然。

  • iconv()和 UTF-8,16,32:一个函数/库,用于在定义明确的、明确的、固定的编码之间进行转码。iconv 处理的所有编码都得到普遍理解和认可,但有一个例外。

可移植的、与编码无关的 C 及其wchar_t可移植字符类型与确定性外部世界之间的桥梁是WCHAR-T 和 UTF 之间的 iconv 转换

那么,我是否应该始终将我的字符串内部存储在与编码无关的 wstring 中,通过 与 CRT 接口wcsrtombs()iconv()用于序列化?从概念上讲:

实际上,这意味着我将为我的程序入口点编写两个样板包装器,例如对于 C++:

这是仅使用纯标准 C/C++ 编写惯用的、可移植的、通用的、与编码无关的程序核心的正确方法,以及使用 iconv 的定义良好的 UTF I/O 接口吗?(请注意,Unicode 规范化或变音符号替换等问题超出了范围;只有在您确定您确实需要Unicode(而不是您可能喜欢的任何其他编码系统)之后,才是处理这些细节的时候了,例如使用专用库像libicu。)

更新

在许多非常好的评论之后,我想补充一些意见:

  • 如果您的应用程序明确想要处理 Unicode 文本,您应该将iconv-conversion 部分作为核心并在 UCS-4 内部使用uint32_t/ -strings。char32_t

  • Windows:虽然使用宽字符串通常很好,但与控制台(任何控制台,就此而言)的交互似乎是有限的,因为似乎不支持任何合理的多字节控制台编码并且mbstowcs基本上无用(其他而不是微不足道的扩大)。GetCommandLineW例如,从 Explorer-drop 和+一起接收宽字符串参数CommandLineToArgvW(也许应该有一个单独的 Windows 包装器)。

  • 文件系统:文件系统似乎没有任何编码概念,只是将任何以空字符结尾的字符串作为文件名。大多数系统采用字节字符串,但 Windows/NTFS 采用 16 位字符串。char16_t在发现哪些文件存在以及处理该数据时(例如,不构成有效 UTF16 的序列(例如裸代理)是有效的 NTFS 文件名),您必须小心。标准 Cfopen无法打开所有 NTFS 文件,因为没有可能的转换将映射到所有可能的 16 位字符串。_wfopen可能需要使用特定于 Windows 的。作为推论,通常没有明确定义的“多少个字符”概念构成一个给定的文件名,因为首先没有“字符”的概念。买者自负。

0 投票
3 回答
295 浏览

visual-c++ - unicode 和框架的深不可测的问题

我遇到了一个非常奇怪的问题...如果将以下琐碎的测试代码注入到单个Cocoa应用程序中,它应该可以正常工作,但是当我在其中一个框架中使用它时,我会得到绝对出乎意料的结果...


怎么会这样,我疯了吗?即使存在内存损坏,它也不可能损坏分配在堆栈上的所有这些值......为什么连wcslen(L"MyWideString")都不起作用?更改测试字符串会更改其长度,但总是错误的,wcstombs返回 -1 ...

setlocale()不在任何地方使用,测试字符串仅包含ASCII字符,为了便于移植,我使用-fshort-wchar编译器选项,但在测试 Cocoa 应用程序的情况下它可以正常工作...

请帮忙!

0 投票
3 回答
4958 浏览

android-ndk - Android NDK 中缺少 std::wstring 支持的解决方案?

我有一个游戏,它在数千个地方使用 std::wstring 作为其基本字符串类型,并使用 wchar_t 及其函数进行操作:wcsicmp() wcslen() vsprintf() 等。

问题是 R5c 不支持 wstring(撰写本文时的最新 ndk)。

由于国际化,我无法更改代码以使用 std::string 并且我会破坏许多游戏使用的游戏引擎......

我有哪些选择?

1 - 用我自己的字符串类替换字符串和 wstring

这会给我更好的平台独立性,但重新实现轮子是荒谬的。我已经开始使用字符串的 COW 实现。我需要它是 COW,因为我将它们用作 hash_maps 中的键。这当然需要大量的工作并且容易出错......但似乎这是我可以做的事情。

2 - 尝试使用我自己实现的 C 标准库的宽字符字符串函数(wcslen、mbstowcs ...)修复 NDK 重新编译 STLPort

这将是更可取的方式......但我不知道该怎么做:(

如何替换 libstdc++.a 或 libstlport_static.a 中的函数(比如说 wcslen)?(不确定它们在哪里:()

而且我不确定我需要重新实现哪些功能,我知道 wcslen 不起作用所以我想它们应该都是......

3 - 你有其他想法吗?

我等不及官方解决这个问题,如果我不知道如何做#2,我将不得不选择#1。

我在某处读到,如果您以 2.3 为目标,则可以使用 wstrings,但我应该以 Android 2.1 为目标。

PS:忘了说我当然需要使用STL,但没有RTTI,我可以毫无例外地生活。

提前致谢!

0 投票
1 回答
1236 浏览

iphone - 如何将 NSString 转换为 TCHAR 或从 TCHAR 转换(使用 CLucene)

我正在为 iPhone 开发一个应用程序,其中我已经导入了 c++CLucene库。几乎所有CLucene函数都需要Stringas TCHAR*

我在转换NSString到/从这种类型的数据时遇到了一些问题。我搜索了很多解决方案,但没有一个有效。

你能告诉我如何进行这种转换吗?

我能够使库与测试字符串定义的with _T()宏一起工作。但是 XCode 给了我:

不推荐使用哪种方法来做到这一点?

谢谢!

编辑:我这样解决了:

从 转换NSStringTCHAR*

从 转换TCHAR*NSString

谢谢你!

0 投票
2 回答
991 浏览

c++ - 如何创建一个正常运行的向量有一个擦除(size_t pos)方法?

我正在创建一个wstring用于 mingw 版本 4.3.0 的 C++ 类,用于 Win32 的交叉编译。我希望我的字符串能够像这样工作std::string,这意味着我想要一种erase(int pos)方法来擦除 position 处的单个元素pos

这是我的第一次尝试:

这看起来应该对我有用,但是当我尝试编译它时,我得到了这个 wacko 编译器错误:

真正奇怪的是,如果我取出erase方法并内联代码,我没有问题:

我很迷惑。