閱讀732 返回首頁    go 阿裏雲 go 技術社區[雲棲]


android開發 在adb shell下查詢中文字符亂碼及logcat中文亂碼的問題

傳說C使用ansi編碼導致在adb shell下查詢中文字符亂碼? 求證 這個應該是運行環境問題吧
在 linux 下很正常(默認utf8編碼)01.coldljy@linux:~/dev/sourcery> adb shell mkdir /data/測試
02.coldljy@linux:~/dev/sourcery> adb shell ls /data/
03.測試
04.tmp
05....
複製代碼有空再到 windows 下試下  你說的是中文字符串吧
C語言的寬字符做的不是很好
char * str = "12434";
這個str存的什麼字符內容,取決於這個文件的編碼格式(沒記錯的話),你用gb2312編碼的,裏麵就是gb2312的字符.
你這個gb2312的字符,在log裏麵直接打印,肯定會亂碼的.


我在網上看了一下,貌似Android的__android_log_write的參數是char*麼...現在問題就變得惡心了一點.可能涉及到編碼問題.
理論上他的ndk log也支持多字符集的,你可能需要多嚐試幾次,看那一種特定的編碼可以出來中文.
還有一種可能就是,直接就不知道其他字符集的,除了Latin1

我剛看了一下源碼和文檔

01.    public static int d(String tag, String msg) {

02.        return println(DEBUG, tag, msg);
03.    }
04.    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 }


最後更新:2017-04-02 22:16:40

  上一篇:go 專訪實戰專家,揭秘iOS神奇開發之路
  下一篇:go window.onload和jQuery中的ready的區別