问题标签 [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 投票
4 回答
7437 浏览

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。

0 投票
7 回答
65053 浏览

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>'

0 投票
2 回答
5078 浏览

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 字符串的应用程序是如何设计的以避免这种烦恼?

谢谢您的回复。

0 投票
2 回答
5487 浏览

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)。

我的理解有什么问题吗?

谢谢。

0 投票
4 回答
23177 浏览

c - 为什么 wchar_t 没有广泛用于 Linux / 相关平台的代码?

这让我很感兴趣,所以我要问 - 为什么wchar_t在 Linux/Linux 类系统上没有像在 Windows 上那样广泛使用?具体来说,Windows API 在内部使用,而我认为 Linux 没有,这反映在许多使用类型wchar_t的开源包中。char

我的理解是,给定一个c需要多个字节来表示的字符,然后在一个char[]表单c中拆分为几个部分,char*而在wchar_t[]. 那么,wchar_t总是使用它不是更容易吗?我是否错过了否定这种差异的技术原因?或者这只是一个收养问题?

0 投票
3 回答
3190 浏览

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 的任何想法?
谢谢

0 投票
3 回答
1899 浏览

c - asprintf 有 wchar_t 版本吗?

我需要一个 C 函数来返回格式化字符串的最终长度,这样我就可以正确分配目标字符串,而不是自己计算长度。在snprintf无法写入整个字符串的情况下,它会执行此操作,但不幸的是,它没有宽字符替代方案。

swprintf在出错的情况下返回 -1,而不是所需的长度(为什么不一样的行为?!?)

提到的标题asprintf似乎也没有帮助,因为它只提供了一个非宽版本。

_vscwprintf可以在 Windows 上使用,但我需要一个跨平台、标准版本或至少一个 Linux 版本,我将 #ifdef 代码。

有任何想法吗?谢谢!

0 投票
3 回答
9597 浏览

c++ - wchar_t 数组

我想要一个 wchar_t 数组。

以下作品:

但这并不

我没有收到任何错误,但 wcAltFinalText 是一个错误的 ptr

非常感谢任何帮助和评论。

0 投票
4 回答
793 浏览

c++ - 释放向量的 wchar_t*

我有一个 wchar_t* 的向量,如下所示:

和一个函数,它接受一个字符串并将其插入向量中

当我关闭程序时,我需要删除向量的分配内存,这样我就不会发生内存泄漏,为此我正在尝试这样做:

它可以编译,一切正常,但是当需要释放内存时,我有一个运行时错误:

错误 http://k.min.us/iklWGE.png

为什么?我怎样才能解决这个问题?

0 投票
1 回答
261 浏览

c++ - C++ exe (MSVC++2010) 中的 Unicode 问题

我有一个奇怪的问题,我不知道它来自哪里。我可能已经更改了 MSVC++2010 项目中的一些设置,但对我来说一切都很好。

我目前正在试验 Windows SDK 6.1 中包含的 VSHADOW.EXE 3.0 工具。这是一种用 C++ 编写的备份程序,其中的字符串由wchar_ts 组成。现在,我传递给程序的参数(例如-q)总是导致程序中出现日文符号字符串。如果我通过 cmd 正常启动程序,但如果我在 Visual Studio 项目设置中指定命令行参数并启动调试器,则会发生这种情况。

有人知道如何解决这个问题吗?谢谢!