如何在JNI C ++中将char *转换为uchar16

时间:2010-06-11 18:55:52

标签: c++ character-encoding

这就是我要做的事情:

typedef uint16_t uchar16_t;
uchar16_t buf[32]; 
// buf will contain timezone information like GMT-6, Eastern Daylight Time, etc

char * str = "Test"; 

for (int i = 0; i <= strlen(str); i++)
     buf[i] = str[i];

我猜这不正确,因为uchar16_t包含2个字节,str包含1个字节。

我应该做什么?

4 个答案:

答案 0 :(得分:3)

strlen的? BUF [32]?试图摧毁宇宙?

你想使用wstringstream。

std::wstringstream lols;
lols << "Test";
std::wstring cakes;
lols >> cakes;

编辑@评论: 你不应该使用strlen,因为任何体面的字符串系统都允许嵌入的零,而strlen非常慢。此外,您没有根据需要调整缓冲区的大小,因此如果您的字符串大小为&gt; 31你会得到缓冲区溢出。此外,您必须(之后动态调整缓冲区大小)手动释放它。这两件事都是C字符串系统的严重缺陷。我的示例代码使您的标准库编写器完成所有工作,并为您避免所有这些问题。

答案 1 :(得分:1)

如果你的字符串永远是ASCII,那实际上是可以的。为了正确地执行此操作,可移植函数是mbstowcs,它假定您从默认语言环境转换,或者如果您在Windows上,则可以使用API​​函数来明确指定源代码页。

答案 2 :(得分:0)

只要str是ASCII,您的代码就可以运行;但是,在循环条件下调用strlen()可能是一个坏主意。如果您的系统上有swprintf(),可能更容易使用uchar16_t buf[32]; char *str = "Test"; swprintf(buf, sizeof buf, "%s", str);

{{1}}

答案 3 :(得分:0)

Have a look here

另外,您是否有充分的理由定义自己的类型?

  

如果您有一个(窄)字符串,则无法将其转换为   通过将您的语言环境设置为“C”然后传递来获取wchar_t字符串   字符串通过mbstowcs()。那是因为“C”语言环境指定   特定字符编码,该编码可能不匹配   执行字符集的编码,所以mbstowcs()可能   将字符映射到意外的东西,甚至可能失败   (如果执行字符集碰巧使用了编码   与C语言环境的编码结构不兼容   字符集。)

     

因此,为了转换char   字符串变成更宽的字符串,你有   把字符逐个复制成一个   wchar_t数组。如果你需要工作   使用Unicode或utf-16或其他   之后,那么wcstombs()就是这样   你应该看看。