原文地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=40110&extra=page%3D3%26filter%3Ddigest%26digest%3D1%26digest%3D1
这个应该是运行环境问题吧
在 linux 下很正常(默认utf8编码)
- coldljy@linux:~/dev/sourcery> adb shell mkdir /data/测试
- coldljy@linux:~/dev/sourcery> adb shell ls /data/
- 测试
- tmp
- ...
复制代码
有空再到 windows 下试下
你说的是中文字符串吧
C语言的宽字符做的不是很好
char * str = "12434";
这个str存的什么字符内容,取决于这个文件的编码格式(没记错的话),你用gb2312编码的,里面就是gb2312的字符.
你这个gb2312的字符,在log里面直接打印,肯定会乱码的.
我在网上看了一下,貌似Android的__android_log_write的参数是char*么...现在问题就变得恶心了一点.可能涉及到编码问题.
理论上他的ndk log也支持多字符集的,你可能需要多尝试几次,看那一种特定的编码可以出来中文.
还有一种可能就是,他丫的直接就不知道其他字符集的,除了Latin1
恩,你差不多可以给我100分拉
我刚看了一下源码和文档
- public static int d(String tag, String msg) {
- return println(DEBUG, tag, msg);
- }
- 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
然后再adb shell后,所显示的中文就都正常了。