我在同一个项目中使用libxml2和ICU。他们代表 UTF8不同。 libxml2使用unsigned char *,ICU构造函数接受普通char *(在我的Pentium 64位上相当于signed char)。
问题:如何在两者之间进行转换?我可以吗? 使用static_cast?
据我所知,UTF8只关心底层数据 类型至少8位长。签名字符和未签名 char满足这一点。我只是想知道是否有 在这里?任何角落案件?
编辑:在我的编译器(g ++ / Gentoo)坚持下,只有reinterpret_cast可以进行这种转换(不依赖于C风格的转换)。让我们说我们有两个无符号字符串:0000和1000.转换会将它们都变为0.这是否可以在UTF8下进行?答案 0 :(得分:3)
有些图书馆使用char
存储UTF-8,其他图书馆使用unsigned char
。
在这种情况下,您可能需要使用char*
在unsigned char*
和reinterpret_cast
之间进行投射,因为这些类型具有相同的存储单元大小和对齐方式。 E.g:
char const* s = ...;
unsigned char const* p = reinterpret_cast<unsigned char const*>(s);
static_cast
始终可以通过中间转换为reinterpret_cast
来模拟void*
,例如char* -> void* -> unsigned char*
,例如:
char const* s = ...;
void const* intermediate = s;
unsigned char const* p = static_cast<unsigned char const*>(intermediate);
答案 1 :(得分:0)
如果unsigned char *只是一个指向字符串的指针,它不应该导致任何问题。
答案 2 :(得分:0)
没关系。在任何情况下,只要您需要从char *或unsigned char *流中提取char,您将需要一个库提供的函数,该函数将提取一个int并以对您不透明的方式更新指针/迭代器(来电者)
答案 3 :(得分:0)
谢谢大家。迈克说得最好:差别没有区别,“一个字节是一个字节就是一个字节”。