在表示 UTF 8 的 signed char 和 unsigned char 之间转换

Convert between signed char & unsigned char representing UTF8

我在同一个项目中使用 libxml2 和 ICU。他们代表 UTF8 不同。 libxml2 使用 unsigned char*,ICU 构造函数采用普通 char*(在我的 Pentium 64 位上等同于 signed char)。

问:如何在两者之间进行转换?我能不能 使用 static_cast?

我理解UTF8只关心底层数据 type 至少有 8 位长。 signed char 和 unsigned 字符满足这个。我只是想知道是否有 明白了吗?任何极端情况?

编辑:在我的编译器 (g++/Gentoo) 的坚持下,只有 reinterpret_cast 可以进行这种转换(不依赖于 C 风格的转换)。假设我们有两个 unsigned char 字符串:0000 和 1000。转换会将它们都变成 0。在 UTF8 下这可能吗?

如果 unsigned char* 只是一个指向字符串的指针,它应该不会造成任何问题。

应该没关系。在任何情况下,一旦您需要从 char * 或 unsigned char * 流中提取一个 char,您将需要库提供的一个函数,该函数将提取一个 int 并以不透明的方式更新 pointer/iterator你(来电者)

一些库使用 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);

谢谢大家。迈克说得最好:没有区别的区别,"a byte is a byte is a byte".