UnicodeString /字符串字面值vs十六进制值
UnicodeString w/ String Literals vs Hex Values
使用unicode字符串字面值与UChar的实际十六进制值是否会看到不同的结果?
UnicodeString s1(0x0040); // @ sign
UnicodeString s2("u0040");
s1不等于s2。为什么?
u转义序列AFAIK是实现定义的,因此在不了解特定编译器的详细信息的情况下,很难说为什么它们不相等。也就是说,这不是一种安全的做事方式。
UnicodeString有一个带UChar和一个带UChar32的构造函数。当我使用它们时,我要明确:
UnicodeString s(static_cast<UChar>(0x0040));
UnicodeString还提供了一个相当方便的unescape()方法:
UnicodeString s = UNICODE_STRING_SIMPLE("\u4ECA\u65E5\u306F").unescape(); // 今日は
无法在ICU 4.8.1.1上复制
#include <stdio.h>
#include "unicode/unistr.h"
int main(int argc, const char *argv[]) {
UnicodeString s1(0x0040); // @ sign
UnicodeString s2("u0040");
printf("s1==s2: %sn", (s1==s2)?"T":"F");
// printf("s1.equals s2: %dn", s1.equals(s2));
printf("s1.length: %d s2.length: %dn", s1.length(), s2.length());
printf("s1.charAt(0)=U+%04X s2.charAt(0)=U+%04Xn", s1.charAt(0), s2.charAt(0));
return 0;
}
=比;
s1 = = s2: T
s1。长度:1 s2。长度:1
s1.charAt (0) = U + 0040 s2.charAt (0) = U + 0040
对于其他发现这一点的人,这是我发现的(在ICU的文档中)。
编译器和运行时字符集的代码页编码是没有在C/c++语言标准中指定,并且通常不是Unicode编码形式。它们通常依赖于单个系统、进程或线程。因此,这是不可能的来实例化Unicode字符或字符串变量C/c++字符或字符串字面值。唯一安全的方法就是使用数值。对于用户界面(UI)字符串来说,这不是问题
[1] http://userguide.icu-project.org/strings
u
常量中的双引号是问题所在。正确计算:
wchar_t m1( 0x0040 );
wchar_t m2( 'u0040' );
bool equal = ( m1 == m2 );
equal
为true
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 如何将包含epoch时间的十六进制字符串转换为time_t
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 如何将一个ostringstream十六进制字符串字符对转换为单个unit8t等价的二进制值
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 通过错误处理,在C++中可靠地获得用户十六进制输入
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 指向存储在字符串 c++ 中的十六进制
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 如何在C++中将十六进制字符串转换为文本数据
- 使用 sprintf 将十六进制0xAABBCC转换为字符串"AA:BB:CC"
- 绝对编码器十六进制输入
- 为什么C++总是显示十六进制内存地址,而不仅仅是整数?
- C++17 十六进制浮点文字单精度后缀冲突?
- 是否可以在C++中获取 CHAR 的有效十六进制地址?
- 未报告的错误VS 2015:十六进制字符说明符
- UnicodeString /字符串字面值vs十六进制值