我正在尝试从 Kotlin 程序(在控制台上运行)打印希伯来语字符。
\n所有希伯来字符都作为问号输出。
\n我创建了以下简单的test.kts脚本文件进行测试:
println("\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f")\n\n// Try to print a simple non-Hebrew character too\nprintln("\\u0394") // Greek Delta\nRun Code Online (Sandbox Code Playgroud)\n文件已正确保存为 UTF-8 格式。
\n它打印:
\n???? ???????\n?\nRun Code Online (Sandbox Code Playgroud)\n我尝试在命令提示符、PowerShell(在其本机窗口和 Windows 终端中)和 Git Bash 中运行它,所有这些都给出相同的结果。我还尝试将输出重定向到文件以排除 shell 中的显示问题。
\n为了确保问题不是控制台本身的问题,我还制作了简单的test.bat、test.ps1、 和test.sh文件,其中包含以下内容:
echo "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f"\nRun Code Online (Sandbox Code Playgroud)\n所有三个 shell 都正确显示了希伯来语文本,表明问题出在 Kotlin 的输出中,而不是 shell 显示中。(虽然 PowerShell 要求文件保存为“UTF-8 with BOM”才能正确显示,但这不是 Kotlin 的问题,因为 Kotlin 甚至不会运行使用 BOM 保存的脚本。)
\n据我所知,Kotlin 应该默认支持 UTF-8 输出,无需配置。
\n我怎样才能得到正确的输出?
\n更新:
\n如果我使用 将输出写入文件java.io.File("out.txt").writeText("\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f"),则它可以正常工作。
另外,如果我打开一个新的PrintStreamusing val out = java.io.PrintStream(System.out, true, "UTF-8"),然后使用 写入它out.println("\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f"),它也可以正常工作。
仅向控制台写入println已损坏。
系统信息:
\nJAVA_HOME指向 JRE 1.8.0_261 (Oracle) 和 11.0.2 (Oracle OpenJDK) 进行测试。(更新在底部)
\n部分答案,但能够在 Kotlin 和 Java 的控制台中获得一些希伯来字符。非常痛苦。包括一些注释掉的内容,以便向您展示如果您遇到任何其他障碍我可能已经尝试过的其他一些事情。
\n使用记事本将 Tester.kt 保存为 UTF-8。
\nfun main(args : Array<String>) {\n System.setProperty("file.encoding", "UTF8")\n //val charset = Charsets.UTF_8\n //val byteArray = "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f".toByteArray(charset)\n //System.out.printf("%c",byteArray.toString(charset))\n //System.out.println(Charset.defaultCharset())\n System.out.println("\xd7\x9c")\n \n}\n\nkotlinc.bat .\\Tester.kt -include-runtime -d Tester.jar\nRun Code Online (Sandbox Code Playgroud)\n现在,这导致了另一个混乱,我通过尝试将希伯来语字符复制并粘贴到 Powershell/Cmd 中发现了这一点。复制时,? 标记立即显现出来。仔细研究了一下,似乎 Powershell ISE 更适合于此(参考如下)。无需任何插件,复制粘贴成功。然后必须运行这个:
\nPS> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8\nRun Code Online (Sandbox Code Playgroud)\n因为在我的系统上,运行以下命令显示:
\nPS> [Console]::OutputEncoding\n\n\nIsSingleByte : True\nBodyName : iso-8859-1\nEncodingName : Western European (Windows)\nHeaderName : Windows-1252\nWebName : Windows-1252\nWindowsCodePage : 1252\nIsBrowserDisplay : True\nIsBrowserSave : True\nIsMailNewsDisplay : True\nIsMailNewsSave : True\nEncoderFallback : System.Text.InternalEncoderBestFitFallback\nDecoderFallback : System.Text.InternalDecoderBestFitFallback\nIsReadOnly : True\nCodePage : 1252\nRun Code Online (Sandbox Code Playgroud)\n然后,
\njava -jar -D"file.encoding=UTF-8" tester.jar\nRun Code Online (Sandbox Code Playgroud)\n瞧,一个拉梅德
\n\xd7\x9c\nRun Code Online (Sandbox Code Playgroud)\n另外,Java 路线可能会也可能不会带来更多见解:
\nTester.java 用记事本保存为 UTF-8,导入是多余的,是的,但显示了一些出色的导入
\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport static java.nio.charset.StandardCharsets.*;\nimport java.nio.*;\n\n\npublic class Tester{\n\n public static void main(String[] args){\n String str1 = "\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f";\n byte[] ptext = str1.getBytes(UTF_8); \n String value = new String(ptext, UTF_8); \n ByteBuffer byteBuffer = StandardCharsets.UTF_8.encode("\xd7\xa9");\n System.out.println(Charset.defaultCharset());\n System.out.println("\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f");\n System.out.println(value);\n System.out.print(byteBuffer.getChar());\n System.out.printf("Value: %s",value);\n }\n\n\n}\nRun Code Online (Sandbox Code Playgroud)\njavac 会给出:
\njavac .\\Tester.java\n.\\Tester.java:8: error: unmappable character (0x9D) for encoding windows-1252\n System.out.println("\xe2\x95\xab\xe2\x8c\x90\xe2\x95\xab\xc2\xa3\xe2\x95\xab\xc3\xb2\xe2\x95\xab? \xe2\x95\xab\xe2\x82\xa7\xe2\x95\xab\xc2\xba\xe2\x95\xab\xc3\xb2\xe2\x95\xab\xc3\xbf\xe2\x95\xab\xc2\xa3\xe2\x95\xab\xc3\x96\xe2\x95\xab\xc6\x92");\nRun Code Online (Sandbox Code Playgroud)\n所以
\njavac -encoding UTF-8 .\\Tester.java\nRun Code Online (Sandbox Code Playgroud)\n再次瞧,仅限 PS ISE:
\nPS> java -D"file.encoding=UFT-8" Tester\nUTF-8\n\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f\n\xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f\n\xed\x9e\xa9Value: \xd7\xa9\xd7\x9c\xd7\x95\xd7\x9d \xd7\x9e\xd7\xa7\xd7\x95\xd7\x98\xd7\x9c\xd7\x99\xd7\x9f\nRun Code Online (Sandbox Code Playgroud)\n我认为这表明存在几个障碍,但它可以与 Kotlin 一起使用,并且在确保文件正确、以正确的方式运行文件并且输出正确之后与 println 一起使用。由于从右到左的性质,希伯来语可能特别困难,我认为希腊语等其他字符更容易。
\n不管怎样,我感受到你的痛苦,祝你好运。据我了解,可能还存在其他瓶颈,例如通过网络发送希伯来语。这让我看到了一些事情,我自己将继续了解这一点。
\n(更新)\n使用之前实际提供的参考中的第二个链接,您可以进行两个小更改并在 Powershell(不仅仅是 ISE)中获取希伯来语!
\nPS> $OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = New-Object System.Text.UTF8Encoding\nRun Code Online (Sandbox Code Playgroud)\n然后,
\nFont: Courier New\nRun Code Online (Sandbox Code Playgroud)\n参考:
\n| 归档时间: |
|
| 查看次数: |
1472 次 |
| 最近记录: |