- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
为什么即使有 UTF-8 字符串文字,C11 或 C++11 中也没有 UTF-8 字 rune 字?我知道,一般来说,字 rune 字表示单个 ASCII 字符,它与单字节 UTF-8 代码点相同,但 C 和 C++ 都没有说编码必须是 ASCII。
基本上,如果我阅读标准正确,则不能保证 '0'
将表示整数 0x30,但 u8"0"
必须表示字符序列 0x30 0x00。
编辑:
我知道并非每个 UTF-8 代码点都适合一个字符。这样的文字仅对单八位字节代码点(又名 ASCII)有用,所以我想称它为“ASCII 字 rune 字”会更合适,所以问题仍然存在。我只是选择用 UTF-8 来构建问题,因为有 UTF-8 字符串文字。我能想象到可移植地保证 ASCII 值的唯一方法是为每个字符编写一个常量,考虑到只有 128 个字符,这还不错,但仍然......
最佳答案
编写不可移植的 C 代码是完全可以接受的,这是这样做的众多充分理由之一。随意假设您的系统使用 ASCII 或其某些超集,并警告您的用户不要尝试在 EBCDIC 系统上运行您的程序。
如果您觉得非常慷慨,您可以对支票进行编码。 gperf
程序可以生成包含此类检查的代码。
_Static_assert('0' == 48, "must be ASCII-compatible");
或者,对于 C11 之前的编译器,
extern int must_be_ascii_compatible['0' == 48 ? 1 : -1];
如果您在 C11 上,则可以在字符常量上使用 u
或 U
前缀,但不能使用 u8
前缀...
/* This is useless, doesn't do what you want... */
_Static_assert(0, "this code is broken everywhere");
if (c == '々') ...
/* This works as long as wchar_t is UTF-16 or UTF-32 or UCS-2... */
/* Note: you shouldn't be using wchar_t, though... */
_Static_assert(__STDC_ISO_10646__, "wchar_t must be some form of Unicode");
if (c == L'々') ...
/* This works as long as char16_t is UTF-16 or UCS-2... */
_Static_assert(__STDC_UTF_16__, "char16_t must be UTF-16");
if (c == u'々') ...
/* This works as long as char32_t is UTF-32... */
_Static_assert(__STDC_UTF_32__, "char32_t must be UTF-32");
if (c == U'々') ...
有一些项目是用非常便携的 C 语言编写的,并且已经移植到非 ASCII 系统 (example)。这需要大量的移植工作,除非您知道要在 EBCDIC 系统上运行您的代码,否则没有真正的理由去做。
关于标准:编写 C 标准的人必须应对所有可能的 C 实现,包括一些非常奇怪的实现。在已知的系统中 sizeof(char) == sizeof(long)
, CHAR_BIT != 8
,整数类型有陷阱表示,sizeof(void *) ! = sizeof(int *)
, sizeof(void *) != sizeof(void (*)())
, va_list
是堆分配的,等等。这是一场噩梦。
不要自责尝试编写将在您从未听说过的系统上运行的代码,也不要在 C 标准中苦苦寻找保证。
例如,就C标准而言,以下是malloc
的有效实现:
void *malloc(void) { return NULL; }
请注意,虽然 u8"..."
常量保证为 UTF-8,但 u"..."
和 U"... "
除了编码分别为每个字符 16 位和 32 位之外,没有任何保证,并且实际编码必须由实现记录。
总结:在 2012 年假设 ASCII 兼容是安全的。
关于c++ - 为什么 C11 或 C++11 中没有 ASCII 或 UTF-8 字 rune 字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10938306/
package main var lettersLower = []rune("abcdefghijklmnopqrstuvwxyz") var lettersUpper = []rune("ABCD
我正在维护一些 Java 代码,我目前正在将它们转换为 C#。 Java 代码是这样做的: sendString(somedata + '\000'); 在 C# 中,我正在尝试做同样的事情: sen
我正在尝试使用 utf8 十六进制代码生成连续字符。例如第一部分,我称之为“基本”代码:259第二部分,我称之为“结束”代码:1(或,2,或 A,或 F,等等) 这些以字符串的形式出现。一旦我附加了结
我有一个字符串 MyString我想在这个数据中附加如下内容: MYString ("1", "a"), ("1", "b") //END result 我的代码是这样的: query :=
这是我的代码段: var converter = map[rune]rune {//some data} sample := "⌘こんにちは" var tmp string for _, runeVa
根据https://blog.golang.org/strings在我的测试中,看起来当我们 range 一个字符串时,我们得到的字符是 rune 类型,但是如果我们通过 str[index] 获取它
我有一个非常非常大的文本文件(比内存大得多)。我想做的是使用类似于: for record in myFile: process_record(); 添加的技巧是我的记录由空行分隔(中间有各种东西)
我想连接一个字符串文字和一个字 rune 字。由于语法不正确,"abc"'d' "efg" 会导致编译器错误: x.c:4:24: error: expected ',' or ';' before
我想连接一个字符串文字和一个字 rune 字。由于语法不正确,"abc"'d' "efg" 会导致编译器错误: x.c:4:24: error: expected ',' or ';' before
我在网上看到一个使用 golang 中的 rune() 函数的函数,但我很难找到它是什么。我正在阅读教程并且对文档没有经验,所以很难找到我要找的东西。 具体来说,我想看看为什么会失败...... fm
我正在查看 string.Map 函数,它必须采用返回 rune 的映射函数。我想通过调用来消除解析为 false 的 rune :unicode.IsPrint() func Map(映射 func
我在按字符排序字符串时遇到问题(要检查两个字符串是否是字谜,我想对它们都进行排序,并检查是否相等)。 我可以像这样得到字符串 s 的 []rune 表示: runes := make([]rune,
什么是rune在围棋? 我一直在谷歌搜索,但 Golang 只说一行: rune是 int32 的别名. 但是整数怎么会像交换案例一样到处使用呢? 下面是一个函数swapcase。什么是<=和 - ?
我正在使用具有此约束规则的泛型: type LineParser[T []rune | string] struct { } 我有那个结构的通用方法: func (it *LineParser[T])
我有一个包含波兰语字符的 csv,但是当我在 SAS 中导入时,某些波兰语字符被替换为“?”或任何其他随机变量,我该如何处理。我有一个所有可能的波兰语字符的列表,我不介意它被它的英语对应字符取代 最佳
我正在创建一个时尚的文本应用程序,但在某些地方出现错误(“字 rune 字中的字符太多”)。我只写了一个字母,但是当我粘贴它时,它会转换成许多这样的字母:“\uD83C\uDD89”,原始字母是“🆉
有点像 const X: char = '0x10FFFC'; 最佳答案 是的,使用\u{..}: const X: char = '\u{10FFFC}'; Playground 这种情况下的一个技
我有一个名为“ roケールストリングのキャッシュ最适化-v3-20160202_1047.pdf”的pdf文件。 使用Google标记管理器从下载URL获取文件名时,我得到的值为“%E4%BE%9B
程序目的: rune 密码 最终编辑: 我现在(感谢 非常有用的 由 Extremely 提供的答案 了不起的人 )完成了我一直在从事的项目;并且 - 对于 future 的读者,我还提供了完整的代码
如何在Scala中为垂直制表符('\v',ASCII 11)编写字 rune 字? '\v'不起作用。 (无效的转义字符)'\11'应该是,但是... scala> '\11'.toInt res13
我是一名优秀的程序员,十分优秀!