- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
函数 c32rtomb
和 mbrtoc32
来自 <cuchar>
/<uchar.h>
在 C Unicode TR (draft) 中被描述为执行 UTF-321 和“多字节字符”之间的转换。
(...) If
s
is not a null pointer, thec32rtomb
function determines the number of bytes needed to represent the multibyte character that corresponds to the wide character given byc32
(including any shift sequences), and stores the multibyte character representation in the array whose first element is pointed to bys
. (...)
什么是“多字节字符表示”?我实际上对以下程序的行为感兴趣:
#include <cassert>
#include <cuchar>
#include <string>
int main() {
std::u32string u32 = U"this is a wide string";
std::string narrow = "this is a wide string";
std::string converted(1000, '\0');
char* ptr = &converted[0];
std::mbstate_t state {};
for(auto u : u32) {
ptr += std::c32rtomb(ptr, u, &state);
}
converted.resize(ptr - &converted[0]);
assert(converted == narrow);
}
其中的断言是否保证保持1?
1 在 __STDC_UTF_32__
的假设下工作已定义。
最佳答案
为了保证断言成立,c32rtomb()
使用的多字节编码必须与用于字符串文字的编码相同,至少与实际使用的字符一样在字符串中。
C99 7.11.1.1/2 指定类别为 LC_CTYPE
的 setlocale()
会影响字符处理函数以及多字节和宽字符函数的行为。我没有看到任何明确承认效果是设置使用的多字节和宽字符编码,但这就是目的。
所以 c32rtomb()
使用的多字节编码是来自默认“C”语言环境的多字节编码。
C++11 2.14.3/2 指定执行编码、宽执行编码、UTF-16 和 UTF-32 用于对应的字符和字符串字面量。因此 std::string narrow
使用执行编码来表示该字符串。
那么这个字符串的“C”语言环境编码和这个字符串的执行编码一样吗?
C99 7.11.1.1/3 指定“C”语言环境为 C 翻译提供“最小环境”。这样的环境不仅包括字符集,还包括所使用的特定字符代码。所以我相信这不仅意味着“C”语言环境必须支持翻译所需的字符(即基本字符集),而且“C”语言环境中的那些字符必须使用相同的字符代码。
字符串文字中的所有字符都是基本字符集的成员,因此将 char32_t
表示转换为 char
"C"语言环境表示必须产生与编译器为 char
字符串文字生成的值序列相同;断言必须成立。
我没有看到任何建议,即执行编码和“C”语言环境之间以兼容的方式支持基本字符集之外的任何内容,所以如果你的字符串文字使用了基本字符集之外的任何字符,那么会有不能保证断言会成立。即使规定了在执行字符集和“C”语言环境中都存在的扩展字符,我看不到表示形式相互匹配的任何要求。
关于c++ - c32rtomb 转换成什么编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13045682/
我正在尝试读取和处理一个大的 json 文件(~16G),但即使我通过指定 chunksize=500 读取小块,它仍然有内存错误。我的代码: i=0 header = True for chunk
请看下图... 我想通过 CSS 实现。 我现在将此分隔符用作在我的容器内响应的图像 ( jpg )。问题是我似乎无法准确匹配颜色或使白色晶莹剔透。 我认为 CSS 是解决这个问题的最佳方式。 尺寸为
所以我正在尝试使用 AngularJS 和 Node.js。我正在尝试设置客户端路由,但遇到一些问题。 编辑 所以我改变了一些代码如下 https://github.com/scotch-io/sta
我想创建如下图所示的边框: 这段代码是我写的 Some Text p{ -webkit-transform: perspective(158px) rotateX(338deg); -webk
好的,所以我有一个包含 2 个选项的选择表 $builder->add('type', 'choice', array( 'label' => 'User type', 'choice
我的代码: private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { ngr.
我正在尝试编写 Tic-Tac-Toe 游戏代码,但不知道如何在轮到我时push_back '+' 字符。 因此,每当玩家输入例如“Oben 链接”时,这基本上意味着左上角,我希望游戏检查输入是否正确
我正在研究 HtmlHelper.AnonymousObjectToHtmlAttributes。 它适用于匿名对象: var test = new {@class = "aaa", placehol
在 stackoverflow 上所有这些 mod 重写主题之后,我仍然没有找到我的问题的答案。我有一个顶级站点,基本上我想做的就是将 /index.php?method=in&cat=Half+Li
仅使用 CSS 可以实现此功能区吗? 最佳答案 .box { width: 300px; height: 300px; background-color: #a0a0a0;
我有一个 jbuilder 模板,它用 json 表示我的一个模型,如下所示: json.(model, :id, :field1, :field2, :url) 如果我只是从控制台访问该字段,则 u
昨天我问了一个问题 - Draw arrow according to path 在那个问题中,我解释说我想在 onTouchEvent 的方向上绘制一个箭头。我在评论中得到了答案,说我应该旋转 Ca
我希望段落中的代码与代码块中显示的代码一致。 例如: The formula method for a linear model is lm(y~x, data = dat). For our da
我使用 ViewPager 获得了一个选项卡菜单。每个选项卡都包含来自 android.support.v4 包的 fragment (与旧 SDK 的兼容性)。其中一个 fragment 是 Web
我正在从事一项需要多种程序能力的科学项目。在四处寻找可用的工具后,我决定使用 Boost 库,它为我提供了 C++ 标准库不提供的所需功能,例如日期/时间管理等。 我的项目是一组命令行,用于处理来自旧
外媒 Windows Latest 报道,随着 Windows 10 的不断发展,某些功能会随着新功能的更新而被抛弃或成为可选项。早在 2018 年,微软就确认截图工具将消失,现代的 “截图和草图”
我有标记的 Angular ,我只希望标记旋转到那个 Angular 。 marker = new google.maps.Marker({ position: myL
我一定是遗漏了什么,但我不知道是什么。我有使用 polymer 实现的简单自定义元素: TECK ..
我有一个关于如何设置我们产品的分步教程。我必须在每个步骤中显示大量示例代码。以下是我必须在页面中显示的代码类型列表。我用什么来格式化所有内容? Java 代码示例 XML 样本 iOS SDK 文件(
我需要在我的 iPad 应用程序中绘制一些图表,所以我遵循了本教程: http://recycled-parts.blogspot.com/2011/07/setting-up-coreplot-in
我是一名优秀的程序员,十分优秀!