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

问题描述 投票:10回答:5

我有一个宽字符文件(希伯来文本)在记事本中看起来很好(以“UTF-8编码”保存),在Notepad ++中读得很好,当我复制并粘贴到MS Word时它看起来也很好。但是当我打开一个“DOS框”(Windows控制台)并转到:“输入file.txt”时,它会打印出乱码。 是的,我在Windows控制台上完成了对Unicode的所有建议:我使用“cmd / u”打开控制台,我将字体更改为Lucida,然后输入:“chcp 65001”。 运行Windows 7的PC和运行Windows XP SP3的另一台PC上的问题完全相同。

windows windows-7 unicode utf-8 hebrew
5个回答
9
投票

Font 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是默认值。 Raster是默认值,未在此处列出,可能是因为它是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(即ale​​ph)。我认为所有这些字体都存在于默认的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之外,命令提示符中不支持大部分或全部带希伯来语的字体。事实上,命令提示符不支持大多数字体完全停止,甚至不是“新罗马时代”(因为“新罗马时代”不是单倍间隔/固定宽度,而且这是它的许多标准之一支持,其他标准似乎更加模糊。

现在,您可以在命令提示符中添加和选择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或UTF16代码> FF的unicode字符集中的任何字符时,记事本有点受限。对于像'type'这样的命令,以及管道和重定向,cmd有点受限。

如果使用cmd.exe你真的需要管道工作'cos管道很重要..

管道仅限于可由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 ..但是你不能起诉管道......(这很糟糕)..最简单的事情是使用文本编辑器,如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范围之外。一个字符> UTF-16的\ uFF,如字符映射所示为> \ uFF,然后使用Notepad2或notepad ++

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

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

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

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

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

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

如果你想从命令提示符复制,如果不是在快速编辑模式下,然后右键单击然后选择标记然后选择它然后按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?

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


4
投票

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

使用chcp 65001可以实现UTF-8,但是在这个代码页的Microsoft C运行时中存在一些令人讨厌的低级错误,这使得某些应用程序不可靠而有些应用程序根本无法运行。

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

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

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

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


1
投票

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

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


1
投票

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

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

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

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


0
投票

如何获得希伯来语的XP安装?

首先,这是关于XP家庭SP3,启用希伯来语。我的意思是它是标准的XP US安装,或者我相信,增加了希伯来语键盘和显示功能。我相信每张XP CD都可以安装这样的系统。特别是,我相信以下是这样一个系统所需要的:

  1. 控制面板 - >日期,时间,语言和区域选项 - >语言和区域选项 - >在语言选项卡中:1)单击详细信息并添加希伯来语键盘。 2)使用V标记复杂脚本和从右到左语言(包括泰语)选项的安装文件。
  2. 控制面板 - >日期,时间,语言和区域选项 - >语言和区域选项 - >在高级选项卡中:接受,标记为V,10004(MAC - 阿拉伯语)和10005(Mac - 希伯来语)。不确定阿拉伯语是否必须在这里。

现在到cmd控制台

如前所述,必须将Courier New字体显式添加到控制台字体注册表中。否则,将不会显示明确的希伯来字体。

现在当打开cmd控制台时,为了输入希伯来字符,所有要做的就是启用Courier New字体,并将键盘更改为希伯来语模式。让Windows滚动键盘的语言很容易。重复按下左Alt和左移键,或用鼠标。

另外,dir命令将显示具有希伯来字符的文件名。但是,人们不能只发出一个

dir file_name

如果文件以希伯来字母开头,则查看通常的输出。肯定是

dir *file_name

我假设星号字符添加了BOM unicode字符。

也可以打开记事本,输入希伯来字符,将文件保存为UTF8,然后在控制台命令中运行以下命令:

chcp 65001
type that_Notepad_file_I_saved

在记事本保存屏幕上将文件保存为UTF8。

© www.soinside.com 2019 - 2024. All rights reserved.