我有一个宽字符文件(带有希伯来语文本)在记事本中看起来很好(以“UTF-8编码”保存),在Notepad ++中读得很好,当我复制并粘贴到MS Word中它看起来很好太。但是,当我打开一个“DOS框”(Windows控制台)并转到:“输入file.txt”时,它打印出乱码。
是的,我已经在Windows控制台上完成了对Unicode的所有建议:我打开了控制台使用“cmd / u”,我将字体改为Lucida,我输入了:“chcp 65001”。
运行Windows 7的PC和运行Windows XP SP3的另一台PC上的问题完全相同。
答案 0 :(得分:9)
字体Courier New
支持希伯来语,可以添加到命令提示符中。默认字体是consolas,lucida,raster,它们都不支持希伯来语。因此,在命令提示符下添加Courier New。
这是一个注册表黑客来做那件事
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支持/角色,但不包括希伯来语
我有
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。
因此,只要所选字体支持,就可以将unicode字符粘贴到cmd上。
要复制/粘贴,请单击charmap中的“复制”按钮
现在它在剪贴板中
要将其粘贴到命令提示符中,请在win7中粘贴到命令提示符中,而不是ctrl-v。您右键单击并选择粘贴。 (或者如果处于快速编辑模式,那么只需右键单击)
这是主要的事情。
<强>另外强>
通常在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)
答案 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