在表示 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_cast
在 char*
和 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".
我在同一个项目中使用 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_cast
在 char*
和 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".