Android ndk log unicode(宽字符)
Posted
技术标签:
【中文标题】Android ndk log unicode(宽字符)【英文标题】:Android ndk log unicode (wide characters) 【发布时间】:2014-12-13 23:42:10 【问题描述】:我正在尝试写入 logcat unicode 字符(UTF16;日文、韩文或中文等宽字符)。唯一的成功是将其作为字符串发送到 Java(例如下面的代码):
unsigned short* text = new unsigned short[100]; // or jchar*
.... // all some unicode to the array
jstring jtext = jniEnv->NewString(text, (jsize)length);
jniEnv->CallVoidMethod( JavaClass, JavaPrintUnicode, jtext );
... // Clean up
// Then java prints it out
但是,如果字节在 char 数组中,__android_log_print
将打印乱码文本。有没有办法在NDK(C++)端打印出文本?
【问题讨论】:
是否可以选择使用 UTF-8? 转换它对我来说比较困难。 请注意,您的JavaPrintUnicode()
方法实际上在后台执行的操作是将您的 UTF-16 转换为 UTF-8 以进行打印。
【参考方案1】:
Android NDK,作为 Linux 的典型,使用 32 位来表示宽字符,所以如果转换为 UTF-32 很简单,你可以试试这个:
unsigned short text[100];
// fill text with UTF-16; make sure that all characters are 2 bytes long
long utf32[100];
for (int i=0; i<100; i++)
utf32[i] = text[i];
__android_log_print(ANDROID_LOG_INFO, "UTF-32", "%ls", utf32);
【讨论】:
谢谢我所需要的。 如何处理跨越多个字符点的 unicode 字符? @RobotMess:如果输入不是普通的 UCS-16,则需要对宽字符的一致支持。为此我推荐Crystax NDK。【参考方案2】:您可以改为打印每个字符的十六进制值。
void print_string_as_hex(WCHAR* ws)
int l = wcslen(ws);
for(int i = 0 ; i < l ; i++)
__android_log_print(ANDROID_LOG_INFO, "MyTag", "%x", ws[i]);
要从十六进制值中获取编码字符,您可以使用 Microsoft Word - 4513[Alt-x]
将为您编码 0x4513
。
【讨论】:
以上是关于Android ndk log unicode(宽字符)的主要内容,如果未能解决你的问题,请参考以下文章