Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)

时间:2012-02-17 00:48:25

标签: windows windows-7 unicode utf-8 hebrew

我有一个宽字符文件(带有希伯来语文本)在记事本中看起来很好(以“UTF-8编码”保存),在Notepad ++中读得很好,当我复制并粘贴到MS Word中它看起来很好太。但是,当我打开一个“DOS框”(Windows控制台)并转到:“输入file.txt”时,它打印出乱码。
是的,我已经在Windows控制台上完成了对Unicode的所有建议:我打开了控制台使用“cmd / u”,我将字体改为Lucida,我输入了:“chcp 65001”。

运行Windows 7的PC和运行Windows XP SP3的另一台PC上的问题完全相同。

4 个答案:

答案 0 :(得分:9)

字体Courier New支持希伯来语,可以添加到命令提示符中。默认字体是consolas,lucida,raster,它们都不支持希伯来语。因此,在命令提示符下添加Courier New。

这是一个注册表黑客来做那件事

http://www.howtogeek.com/howto/windows-vista/stupid-geek-tricks-enable-more-fonts-for-the-windows-command-prompt/

http://www.techrepublic.com/blog/windows-and-office/quick-tip-add-fonts-to-the-command-prompt/

这是如何安装字体的一个很好的例子,但我应该删除很多这些条目,因为大多数条目都没有添加到cmd,因为cmd不支持它们。

Lucida和Consolas是默认值 光栅是默认值,此处未列出,可能是因为它是TTF
在我尝试添加的所有这些中,只添加了3个(由cmd支持)
Courier New,DejaVu Sans Mono,Droid Sans Mono

DejaVu Sans Mono和Droid Sans Mono可以下载,由cmd支持,可能有一些很好的unicode支持/角色,但不包括希伯来语

enter image description here

我有

Consolas <-- default
Courier New  <--- added
DejaVu Sans Mono  <-- added
Droid Sans Mono  <-- added
Lucida Console <-- default
Raster Fonts <-- default

常见的希伯来字体是Miriam和David,但它们无法添加到命令提示符中。

对于记录,Babelmap可以列出系统中支持希伯来语的所有字体,例如:在babelmap中 - 单击fonts..font coverage,然后输入05D0(即&#39; s aleph)。我认为所有这些字体都存在于默认的Windows 7安装

Aharoni, Arial, Courier New, David, FrankRuehl, Gisha, Levenim MT, Lucida Sans Unicode, Microsoft Sans Serif, Miriam, Miriam Fixed, Narkisim, Rod, Segoe WP, Tahoma, Times New Roman

但是除了Courier New之外,命令提示符中不支持大多数或所有带希伯来语的字体。实际上,在命令提示符中不支持大多数字体完全停止,甚至不是新罗马&#34;(因为&#34;新罗马&#34;不是单倍间距/固定宽度,而且这是支持它的许多标准之一,其他标准似乎更加模糊。

现在,您可以在命令提示符中添加并选择使用Courier New。

enter image description here

因此,只要所选字体支持,就可以将unicode字符粘贴到cmd上。

enter image description here

要复制/粘贴,请单击charmap中的“复制”按钮

现在它在剪贴板中

要将其粘贴到命令提示符中,请在win7中粘贴到命令提示符中,而不是ctrl-v。您右键单击并选择粘贴。 (或者如果处于快速编辑模式,那么只需右键单击)

enter image description here

这是主要的事情。

<强>另外

通常在Windows中,人们可能会使用记事本和字符映射......但是应该注意它们的一些限制。

当您选择的字体支持时,字符映射显示前65536个unicode字符,字符映射显示UTF-16代码。没关系,您仍然可以从字符映射粘贴到cmd.exe窗口,但是您应该知道在cmd.exe和管道中运行的命令不支持utf-16。所以你可以使用字符映射,找到一个字符,例如aleph 05d0,但是值得查看http://www.fileformat.info/info/unicode/char/05d0/index.htm上的字符并看到当utf-16代码是05d0时,utf-8代码是d790。 xxd命令和文件命令对于查看文件的实际内容和确定文件类型非常有用。

对于unicode或unicode字符集中UTF16代码为&gt;的任何字符,记事本有点受限。 FF。 cmd在某些命令方面有点受限,例如&#39; type&#39;,以及管道和重定向。

如果使用cmd.exe,你真的需要使用管道来管道系统很重要..

管道仅限于可由CHCP命令指定的编码。

(请注意,如果CHCP告诉您在特定代码页上,例如850,它会告诉您输入编码。如果您运行命令chcp 850,它将改变输入和输出编码。通常它们它们是相同的。当它们相同时它更简单。但是如果你使用其他程序来改变cmd的编码,例如c#编译器有一个改变它的开关,那么最好改变它使用chcp,因此您知道两种编码都已设置。)

有一个CHCP 1200(UTF-16LE)和1201(UTF-16BE),但都不支持,如果您尝试它会说无效代码页(在win7中测试)。 CHCP不支持UTF-16(它不支持UTF16LE或UTF16BE)。有CHCP 65001(没有BOM的那个UTF-8)。并且有CHCP 862(在MSDOS日常方式中的老式方式,编码希伯来语,我提到过)

type命令支持UTF16LE和记事本一样(记事本调用Unicode的是UTF-16 LE),但管道和重定向不支持。 type命令还支持CHCP指定/支持的任何代码页。因此类型支持862或65001。

因此你可以使用记事本将其保存为UTF8(带有BOM),然后摆弄以移除BOM。 (那有点矫枉过正了)..或者你可以使用记事本,将它保存为Unicode UTF 16LE ..但是你不能起诉管道......(这很糟糕)..最容易的事情是do是使用像notepad2或notepad ++这样的文本编辑器,它支持没有BOM的UTF8。

或者如果从cmd做所有事情你可以使用862或65001.虽然许多文本编辑可能不会给予862的良好支持。所以你可能更喜欢65001。

如果你想在记事本中写任何文件并且它的字符大于UTF16中的字符被称为\ uFF,并且你想在该文件的cmd.exe中运行命令,那么一些命令(例如类型)命令),如果你不考虑什么是支持的话会有问题。

记事本支持带BOM的UTF-16BE,UTF-16LE和UTF-8。那不好。并且无需使用xxd和sed或其他命令来移除BOM。如果您有任何带有所谓unicode字符的文件,则该字符位于常规ascii范围之外。字符&gt; UTF-16&#39; \ uFF,如字符映射所示为&gt; \ uFF,然后使用Notepad2或notepad ++

Type支持UTF16LE,以及CHCP设置的任何代码页,例如65001或862。

管道和重定向按照CHCP设置的任何方式进行。

代码页862已经过时,因此代码页65001是一个很好的方法。

xxd和file对于查看文件的编码方式非常有用,如果您遇到问题可能会有所帮助。但并非绝对必要。

因此,如果你想编写一个用于CMD的文件,并且它有一些unicode字符,那么你可以使用xxd和sed之类的命令来删除BOM,以及其他命令来执行此操作。在文本编辑器中创建这样一个文件的最简单方法是使用文本编辑器,如notepad2或notepad ++,它支持没有BOM的UTF8。

如上所述,获取希伯来语显示可能是最重要的事情。接下来就是能够在文本编辑器中保存文件,您可以使用例如&#39;类型&#39 ;.

如果您想要从命令提示符复制,如果不是快速编辑模式,则右键单击然后选择标记然后选择它然后按ENTER键。然后粘贴右键并选择粘贴。

还有一点是

显然chcp 65001中存在一些错误,其中一些批处理文件不会运行,也许某些C程序也无法运行。 How to use unicode characters in Windows command line?当cmd在代码页65001中时,我甚至看到了c尖锐的编译器崩溃(尽管有人可能会责怪c尖锐的编译器,也可能会责怪65001)Why is csc.exe crashing when I last left the output encoding as UTF8?

注意 - 此答案的早期版本有一些命令行示例,但它们不必要地复杂。我可能会在某些时候添加一些命令来演示我所描述的内容,但它相当简单。

答案 1 :(得分:4)

/u适用于UTF-16LE,不适用于UTF-8。这就是为什么将文件保存为UTF-16LE(Windows / Notepad误导性地称之为“Unicode”)并与/u一起运行的原因,就像它一样。

使用chcp 65001 可以实现,但是此代码页的Microsoft C运行时存在一些令人讨厌的低级别错误,这使得某些应用程序不可靠而某些应用程序不可靠一直跑。

所以是的,我很抱歉,但UTF-8是Windows下的二等公民。任何使用IO的“ANSI”接口,包括使用C标准IO库的任何东西,包括命令提示符,都无法正确处理它。

在命令提示符中获取Unicode输出的唯一可靠方法是使用特定于Windows的WriteConsoleW接口直接推送Unicode字符串。不幸的是,由于跨平台无法使用,许多工具都不会使用它。

在任何情况下,即使您拥有正确的编码,您仍然必须在命令提示符中包含包含所需字符的字体。我相信这就是为什么你仍然没有在/u + UTF-16LE路线上获得希伯来语。

摘要:命令提示符+非ASCII ==几乎肯定会失败。放弃并找到一些可以更好地支持Unicode的其他界面。

答案 2 :(得分:1)

您应该在file.txt之前将type file.txt转换为UTF-16(Little Endian)

参考:What encoding/code page is cmd.exe using?

答案 3 :(得分:1)

当你说“Lucida”时,我认为你的意思是“Lucida Console”。

使用charmap应用程序,我在字体中找不到任何希伯来字符。我不知道在早期版本的Windows中该字体是否更强大,但在Windows 7中似乎没有任何欧洲字符之外的东西。

我的系统还有Lucida Sans打字机,其中包含希伯来字符。不幸的是,Cmd窗口并未将其显示为选项。您需要编辑注册表以打开更多选项,如SuperUser上的此问题所示:https://superuser.com/questions/5035/how-to-change-the-windows-console-font

P.S。我无法验证此解决方案,因为Windows很难。见https://superuser.com/questions/390933/how-to-add-a-font-to-the-cmd-window-choices-in-windows-7-64-bit