在签名的char&之间转换表示UTF8

时间:2015-05-14 03:28:09

标签: c++ c utf-8

我在同一个项目中使用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下进行?

4 个答案:

答案 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)

谢谢大家。迈克说得最好:差别没有区别,“一个字节是一个字节就是一个字节”。