问题标签 [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.
c++ - C++ 中的跨平台字符串(和 Unicode)
所以我终于回到了我的主要任务——将一个相当大的 C++ 项目从 Windows 移植到 Mac。
我马上就遇到了 wchar_t 在 Windows 上是 16 位但在 Mac 上是 32 位的问题。这是一个问题,因为所有的字符串都由 wchar_t 表示,并且会有字符串数据在 Windows 和 Mac 机器之间来回传输(以磁盘数据和网络数据形式)。由于它的工作方式,在发送和接收数据之前将字符串转换为某种通用格式并不完全简单。
我们最近也真正开始支持更多的语言,因此我们开始处理大量的 Unicode 数据(以及处理从右到左的语言)。
现在,我可能会在这里混淆多个想法,给自己带来比需要更多的问题,这就是我问这个问题的原因。我们认为将所有内存中的字符串数据存储为 UTF-8 是很有意义的。它解决了 wchar_t 大小不同的问题,这意味着我们可以轻松支持多种语言,并且还大大减少了我们的内存占用(我们加载了很多 - 主要是英语 - 字符串) - 但似乎没有很多人在做这个。我们缺少什么吗?您必须处理一个明显的问题,即字符串长度可能小于存储该字符串数据的内存大小。
还是使用 UTF-16 是一个更好的主意?还是我们应该坚持使用 wchar_t 并编写代码在 wchar_t 和 Unicode 之间进行转换,在我们读/写磁盘或网络的地方?
我意识到这很危险地接近征求意见 - 但我们很担心我们忽略了一些明显的东西,因为它似乎没有很多 Unicode 字符串类(例如) - 但是有很多代码可以转换为/来自 Unicode,例如 boost::locale、iconv、utf-cpp 和 ICU。
c++ - 如何将 wchar_t* 转换为 std::string?
我将班级更改为使用 std::string (基于我在这里得到的答案,但我有一个函数返回 wchar_t *。如何将其转换为 std::string?
我试过这个:
但它显示错误 C2440: 'initializing' : cannot convert from 'wchar_t *' to 'std::basic_string<_Elem,_Traits,_Ax>'
visual-studio-2010 - wchar_t 在 Visual Studio 中是 2 字节,存储 UTF-16。Unicode 感知应用程序如何处理 U+FFFF 以上的字符?
我们公司正计划让我们的应用程序支持 Unicode,并且我们正在分析我们将遇到的问题。
特别是,例如,我们的应用程序将严重依赖字符串的长度,我们希望将其wchar_t
用作基本字符类。
当处理必须在 UTF-16 中以 2 个 16 位为单位存储的字符时出现问题,即 U+10000 以上的字符。
简单的例子:
我有 UTF-8 字符串“蟂”(Unicode 字符 U+87C2,在 UTF-8 中:E8 9F 82)
所以,我设置了以下代码:
好的,这行得通,它分配了两次 16 位,我的缓冲区wchar_t
包含 { 0x87c2, 0x0000 }。如果我将它存储在 a 中std::wstring
并计算大小,我得到 1。
现在,让我们以字符 (U+104A2) 作为输入,在 UTF-8 中:F0 90 92 A2。
这一次,它为三个 wchar_t 分配空间并且 std::wstring::size 返回 2即使我认为我只有一个 character。
这是有问题的。让我们假设我们以 UTF-8 格式接收数据。我们可以简单地通过不计算等于的字节来计算 Unicode 字符10xxxxxx
。我们想将该数据导入到数组中wchar_t
以使用它。如果我们只是分配字符数加一,它可能是安全的……直到有人使用 U+FFFF 以上的字符。然后我们的缓冲区将太短,我们的应用程序将崩溃。
那么,对于相同的字符串,以不同的方式编码,计算字符串中字符数的函数会返回不同的值吗?
使用 Unicode 字符串的应用程序是如何设计的以避免这种烦恼?
谢谢您的回复。
c++ - 冲突:在 C++ 标准和 Windows 实现中定义 wchar_t 字符串?
从 c++2003 2.13
宽字符串文字的类型为“<strong>array of n const wchar_t”并具有静态存储持续时间,其中 n 是字符串的大小,定义如下
宽字符串文字的大小是转义序列、通用字符名称和其他字符的总数,加上终止 L'\0' 的数量。
从 c++0x 2.14.5
宽字符串文字的类型为“<strong>array of n const wchar_t”,其中 n 是字符串的大小,定义如下
char32_t 或宽字符串文字的大小是转义序列、通用字符名称和其他字符的总数,加上终止 U'\0' 或 L'\0' 的数量。
char16_t 字符串文字的大小是转义序列、通用字符名称和其他字符的总数,每个需要代理对的字符加一个,终止 u'\0' 加一个。
C++2003 中的声明相当模糊。但在 C++0x 中,计算字符串长度时,宽字符串字面量 wchar_t 应与 char32_t 相同,与 char16_t 不同。
在https://stackoverflow.com/questions/402283?tab=votes%23tab-top中有一篇文章清楚地说明了 windows 如何实现 wchar_t
简而言之,windows 中的 wchar_t 是 16 位,使用 UTF-16 编码。标准中的声明显然在 Windows 中留下了一些冲突的东西。
例如,
这超过了 16 位,对于 UTF-16,它需要两个 16 位来对其进行编码(代理对)。
但是,根据标准,kk 是 2 个 wchar_t 的数组(1 代表通用名称 \U000E005,1 代表 \0)。
但在内部存储中,Windows 需要 3 个 16 位 wchar_t 对象来存储它,2 个 wchar_t 用于代理对,1 个 wchar_t 用于 \0。因此,从数组的定义来看,kk 是一个包含 3 个 wchar_t 的数组。
这显然是相互矛盾的。
我认为 Windows 的一个最简单的解决方案是“禁止”任何需要 wchar_t 中的代理对的东西(“禁止”BMP 之外的任何 unicode)。
我的理解有什么问题吗?
谢谢。
c - 为什么 wchar_t 没有广泛用于 Linux / 相关平台的代码?
这让我很感兴趣,所以我要问 - 为什么wchar_t
在 Linux/Linux 类系统上没有像在 Windows 上那样广泛使用?具体来说,Windows API 在内部使用,而我认为 Linux 没有,这反映在许多使用类型wchar_t
的开源包中。char
我的理解是,给定一个c
需要多个字节来表示的字符,然后在一个char[]
表单c
中拆分为几个部分,char*
而在wchar_t[]
. 那么,wchar_t
总是使用它不是更容易吗?我是否错过了否定这种差异的技术原因?或者这只是一个收养问题?
c++ - 在 C++ 中转换类型时出错
我有一个程序需要使用 Format(); 将字符串文字和 int 组合成 CString 变量的函数。我尝试了几种不同的方法,它们的代码在这里:
第一个返回错误 C2664: 'void ATL::CStringT::Format(const wchar_t *,...)' : cannot convert parameter 1 from 'const char [33]' to 'const wchar_t *'
第二个,没有错误,但文本显示为汉字。
第三个返回错误 C2440: 'static_cast' : cannot convert from 'const char [33]' to 'wchar_t'
将 CStrings 转换为 wchar_t *s 的任何想法?
谢谢
c - asprintf 有 wchar_t 版本吗?
我需要一个 C 函数来返回格式化字符串的最终长度,这样我就可以正确分配目标字符串,而不是自己计算长度。在snprintf
无法写入整个字符串的情况下,它会执行此操作,但不幸的是,它没有宽字符替代方案。
swprintf
在出错的情况下返回 -1,而不是所需的长度(为什么不一样的行为?!?)
提到的标题asprintf
似乎也没有帮助,因为它只提供了一个非宽版本。
_vscwprintf
可以在 Windows 上使用,但我需要一个跨平台、标准版本或至少一个 Linux 版本,我将 #ifdef 代码。
有任何想法吗?谢谢!
c++ - wchar_t 数组
我想要一个 wchar_t 数组。
以下作品:
但这并不
我没有收到任何错误,但 wcAltFinalText 是一个错误的 ptr
非常感谢任何帮助和评论。
c++ - 释放向量的 wchar_t*
我有一个 wchar_t* 的向量,如下所示:
和一个函数,它接受一个字符串并将其插入向量中
当我关闭程序时,我需要删除向量的分配内存,这样我就不会发生内存泄漏,为此我正在尝试这样做:
它可以编译,一切正常,但是当需要释放内存时,我有一个运行时错误:
为什么?我怎样才能解决这个问题?
c++ - C++ exe (MSVC++2010) 中的 Unicode 问题
我有一个奇怪的问题,我不知道它来自哪里。我可能已经更改了 MSVC++2010 项目中的一些设置,但对我来说一切都很好。
我目前正在试验 Windows SDK 6.1 中包含的 VSHADOW.EXE 3.0 工具。这是一种用 C++ 编写的备份程序,其中的字符串由wchar_t
s 组成。现在,我传递给程序的参数(例如-q
)总是导致程序中出现日文符号字符串。如果我通过 cmd 正常启动程序,但如果我在 Visual Studio 项目设置中指定命令行参数并启动调试器,则会发生这种情况。
有人知道如何解决这个问题吗?谢谢!