[devdiv精华转载] android开发 在adb shell下查询中文字符乱码及logcat中文乱码的问题 很给力

原文地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=40110&extra=page%3D3%26filter%3Ddigest%26digest%3D1%26digest%3D1

 

传说C使用ansi编码导致在adb shell下查询中文字符乱码? 求证

 

这个应该是运行环境问题吧
在 linux 下很正常(默认utf8编码)

  1. coldljy@linux:~/dev/sourcery> adb shell mkdir /data/测试
  2. coldljy@linux:~/dev/sourcery> adb shell ls /data/
  3. 测试
  4. tmp
  5. ...
复制代码

有空再到 windows 下试下

 

 

你说的是中文字符串吧
C语言的宽字符做的不是很好
char * str = "12434";
这个str存的什么字符内容,取决于这个文件的编码格式(没记错的话),你用gb2312编码的,里面就是gb2312的字符.
你这个gb2312的字符,在log里面直接打印,肯定会乱码的.

我在网上看了一下,貌似Android的__android_log_write的参数是char*么...现在问题就变得恶心了一点.可能涉及到编码问题.
理论上他的ndk log也支持多字符集的,你可能需要多尝试几次,看那一种特定的编码可以出来中文.
还有一种可能就是,他丫的直接就不知道其他字符集的,除了Latin1

 

 

 

恩,你差不多可以给我100分拉
我刚看了一下源码和文档

  1.     public static int d(String tag, String msg) {
  2.         return println(DEBUG, tag, msg);
  3.     }
  4.     public static native int println(int priority, String tag, String msg);
复制代码

在来看这个println怎么实现的:
103 static jint android_util_Log_println(JNIEnv* env, jobject clazz,
104     jint priority, jstring tagObj, jstring msgObj)
105 {
106     const char* tag = NULL;
107     const char* msg = NULL;
108 
109     if (msgObj == NULL) {
110         jclass npeClazz;
111 
112         npeClazz = env->FindClass("java/lang/NullPointerException");
113         assert(npeClazz != NULL);
114 
115         env->ThrowNew(npeClazz, "println needs a message");
116         return -1;
117     }
118 
119     if (tagObj != NULL)
120         tag = env->GetStringUTFChars(tagObj, NULL);
121     msg = env->GetStringUTFChars(msgObj, NULL);
122 
123     int res = android_writeLog((android_LogPriority) priority, tag, msg);
124 
125     if (tag != NULL)
126         env->ReleaseStringUTFChars(tagObj, tag);
127     env->ReleaseStringUTFChars(msgObj, msg);
128 
129     return res;
130 }

好了,问题就在这个GetStringUTFChars函数上:
http://java.sun.com/docs/books/jni/html/objtypes.html
sun的文档显示:
jstring的获取UTFstring其实返回的是UTF-8编码的char*
The Java_Prompt_getLine function calls the JNI function GetStringUTFChars to read the contents of the string. The GetStringUTFChars function is available through the JNIEnv interface pointer. It converts the jstring reference, typically represented by the Java virtual machine implementation as a Unicode sequence, into a C string represented in the UTF-8 format. If you are certain that the original string contains only 7-bit ASCII characters, you may pass the converted string to regular C library functions such as printf. (We will discuss how to handle non-ASCII strings in Section 8.2.) 


现在问题就变得很简单:
你的NDK log只需要传入UTF-8的char*,就能正常显示.
去把你的C文件搞成UTF-8编码的就好了

 

 

 

 

回复 4# egmkang 

哈哈,又遇见高人了。嗯,学习新知识了。

可能是我表达清楚。我想问的问题是:
我的Android手机在SD卡下存储着一些中文名文件,在XP下adb shell后,运行"ls /sdcard",所有的中文文件名都是 无意义中文中夹杂少量乱码。
想问下这情况是怎么回事呢?

 

 

谢谢coldjy

搜了下XP下CMD的字符集是gbk,自己的机子上采集新宋体。
在cmd下通过 chcp命令改变代码页,UTF-8的代码页为65001

  1. chcp 65001
复制代码

然后再adb shell后,所显示的中文就都正常了。

posted on 2011-12-06 14:36  Evalon  阅读(992)  评论(0)    收藏  举报

导航