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(宽字符)的主要内容,如果未能解决你的问题,请参考以下文章

在非NDK编译条件下使用Android Log函数

NDK开发: 打印C代码的调试信息Log

Android NDK 开发--常见错误锦集合Log的使用

FFmpeg获取视频正确的宽高比

使用__android_log_print打印Opencv Mat,Android NDK的内容

Android Studio NDK 入门教程--优雅的在C++中输出Logcat