我认为这只是Python 2的问题,但现在与Java(Windows 10,JDK8)都遇到了类似的问题。
到目前为止,我的搜索结果几乎无法解决。
我从“ stdin”输入流中读取了以下值:// Glogal variable
private lateinit var getShowsNetworkCall: Call<List<Show>>
void loadShows() {
// You can add parameters to the call here
getShowsNetworkCall = service.getShows()
getShowsNetworkCall.enqueue(object: Callback<List<Show>>) {
override fun onResponse(call: Call<List<Trip>>, response: Response<List<Trip>>) {...}
override fun onFailure(call: Call<List<Show>>, t: Throwable) {...}
}
}
override fun onCleared() {
super.onCleared()
getShowsNetworkCall?.cancel()
}
。当我将其打印到控制台时,得到以下信息:Viļāni
。
相关代码段如下:
Vi????ni
关于我的问题的进一步扩展如下:
我读取了包含以下两行的文件:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
ArrayList<String> corpus = new ArrayList<String>();
String inputString = null;
while ((inputString = in.readLine()) != null) {
corpus.add(inputString);
}
String[] allCorpus = new String[corpus.size()];
allCorpus = corpus.toArray(allCorpus);
for (String line : allCorpus) {
System.out.println(line);
}
当我从磁盘读取并输出到第二个文件时,得到以下输出:
を
Sōten_Kōro
当我使用
ã‚’
S�ten_K�ro
从stdin中读取文件时,得到以下输出:
cat testinput.txt | java UTF8Tester
两者显然都是错误的。我需要能够将正确的字符打印到控制台和文件。我的示例代码如下:
???
S??ten_K??ro
真的停留在这里,我们将不胜感激!提前致谢。保罗
答案 0 :(得分:1)
您看到的错误是一个特殊字符,它是两个字节的UTF-8序列,但是每个(特殊UTF-8)字节都被解释为默认的单字节编码,但是没有值,因此两次{{1 }}替换。
因此:
?
要检查您当前的计算机系统是否使用日语:
BufferedReader stdinReader = new BufferedReader(new InputStreamReader(System.in));
String[] stdinData = readLines(stdinReader);
printToFile(stdinData, "stdin_out.txt");
Path path = Paths.get("testinput-utf8.txt");
List<String> lines = Files.readAllLines(path); // Here the default is UTF-8!
Path path = Paths.get("testinput-winlatin1.txt");
List<String> lines = Files.readAllLines(path, "Windows-1252");
Files.write(lines, Paths.get("file_out.txt"), StandardCharsets.UTF_8);
看不到System.out.println("Hiragana letter Wo '\u3092'."); // Either を or ?.
到默认系统编码的转换。
を是U + 3092,用\ u3092进行u编码为ASCII。
要在Windows下创建UTF-8文本,
?
在这里,我使用了一个丑陋的(通常不需要)的BOM标记char Files.write(Paths.get("out-utf8.txt"),
"\uFEFFHiragana letter Wo '\u3092'.".getBytes(StandardCharsets.UTF_8));
(零宽度的空格),它将使Windows记事本识别UTF-8中的文本。