【问题标题】:Android ndk log unicode (wide characters)Android ndk log unicode(宽字符)
【发布时间】: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 以进行打印。

标签: java c++ unicode android-ndk logcat


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2020-02-04
    • 2012-03-07
    • 1970-01-01
    • 2013-01-07
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多