在代表 UTF8 的有符号字符和无符号字符之间进行转换

Convert between signed char & unsigned char representing UTF8

本文关键字:字符 无符号 之间 转换 符号 UTF8      更新时间:2023-10-16

我在同一项目中使用libxml2和icu。他们代表UTF8不同。libxml2使用未签名的char*,而ICU构造函数则采用普通的char*(在我的五角星64位上等同于签名的char)。

问题:如何在两者之间进行转换?我可以吗使用static_cast?

我了解UTF8仅关心基础数据类型至少要长8位。两者都签名和未签名char满足了这一点。我只是想知道是否有在这里陷入困境?有任何角案吗?

编辑:在我的编译器(G /Gentoo)坚持下,只有Reinterpret_cast才能进行此转换(而无需依赖C风格的铸件)。假设我们有两个未签名的char弦:0000和1000。转换会将它们都变成0。

有些库使用char存储UTF-8,而另一些库则使用unsigned char

在这种情况下,您可能需要使用reinterpret_castchar*unsigned char*之间施放,因为这些类型具有相同的存储单元大小和对齐方式。例如:

char const* s = ...;
unsigned char const* p = reinterpret_cast<unsigned char const*>(s);

static_cast始终可以通过中间转换为void*模拟reinterpret_cast,例如char* -> void* -> unsigned char*,例如:

char const* s = ...;
void const* intermediate = s;
unsigned char const* p = static_cast<unsigned char const*>(intermediate);

如果无符号char*只是字符串的指针,它不应引起任何问题。

应该没关系。无论如何,一旦您需要从字符 *或无符号char *流中提取char,您将需要图书馆提供的功能,该功能将以不透明的方式提取int并更新指针/迭代器(呼叫者)

谢谢大家。迈克说最好的是:没有什么区别的差异,"字节是字节是一个字节"。