泰语脚本似乎在 java for-each 循环中丢失了 UTF-8 编码

Thai script seems to lose UTF-8 encoding in java for-each loop

我正尝试在 Windows 10.Android Studio 中开发一个应用程序。

问题:以下泰语单词字符串数组:

String[] myTHarr = {"มาก","เชี่ยว","แน่","ม่อน","บ้าน","พูด","เลื่อย","เมื่อ","ช่ำ","แร่"};

...当由以下 for-each 循环处理时:

for (String s:myTHarr){
  //s = มา� before executing any of the below code:
  byte[] utf8EncodedThaiArr = s.getBytes("UTF-8"); 
  String utf8EncodedThai = new String(utf8EncodedThaiArr); //setting breakpoint here
  // s is still มาà¸�     (I want it to be มาก)
  //do stuff
}

在尝试处理第一个单词时结果为 s = ม ]

泰语脚本正确出现在字符串数组中(声明直接从 Android Studio 复制),java 文件的文件编码设置为 UTF-8(根据 ), and the File Encoding Settings look like this (per ):

根据文档,String(byte[]) 构造函数“通过使用平台的默认字符集解码指定的字节数组来构造一个新字符串。”

我猜默认字符集不是 UTF-8。所以解决方案是指定字节数组的编码。

String utf8EncodedThai = new String(utf8EncodedThaiArr, "UTF-8"); //setting breakpoint here

我用附加设置试过你的代码,代码工作正常。

正如评论中的几位指出的那样,问题 必须 在我的环境中。经过更多搜索后,我发现我应该在更改编码后重建项目(因此仅仅切换到 UTF8 并单击 'Apply'/'OK' 是不够的)。这里需要注意的是,我的文件编码设置是这样的,供参考:

重建后,我开始在包含泰语的字符串数组上收到编译器错误“编码 cp1252 的不可映射字符”(旁注:一些泰语字符很好,其他呈现为 � 和朋友。我会认为要么所有泰语都可以工作,要么none,但很惊讶地看到即使是常见的泰语字母,如 ก 也会导致编译器窒息。

该错误导致了 this post,我在其中尝试了一些操作以将编译器选项设置为 UTF8。由于我的应用程序恰好是 'pre-process' 的一种 android 应用程序,因此与应用程序本身是分开的(如果这有意义的话),我没有使用 compilerOptions 的奢侈属性作为上述 SO post 推荐的答案(尽管我已将其添加到 android 应用程序端的 gradle)。这导致我通过 powershell 设置环境变量 JAVA_TOOLS_OPTIONS:

setx JAVA_TOOLS_OPTIONS "-Dfile.encoding=UTF8"

解决了问题!