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

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

在运行Windows 7的PC上以及在运行Windows XP SP3的另一台PC上,问题是一样的。

/u是UTF-16LE,而不是UTF-8。 这就是为什么将文件保存为UTF-16LE(Windows /记事本误导性地称为“Unicode”)和/u运行的原因。

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

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

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

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

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

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是默认设置。
光栅是一个默认没有在这里列出可能是因为它是一个TTF
在所有这些我试图添加,只有3添加(由CMD支持)
新快递,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中点击字体..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添加并选择使用命令提示符。

在这里输入图像说明

然后你可以去字符映射,选择Courier New或任何具有希伯来字体的字体,例如05D0看,用于\ u05D0(希伯来字母aleph),并将其粘贴到cmd中,并显示注释 – 字符映射使用UTF-16编码点所以要在charmap中找到一个字母,请确保使用UTF-16编码点而不是UTF-8编码点。 所以,例如在utf-8中看到Aleph的十六进制,在utf-16中看到这个十六进制,对于charmap你需要UTF-16之一,所以在aleph 05D0的情况下。

在这里输入图像说明

要复制/粘贴,请点击charmap中的复制按钮

现在它在剪贴板中

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

在这里输入图像说明

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

至于CHCP改变代码页,确定可以帮助输入命令和命令输出,但如上所述,获得希伯来文显示可能是最重要的事情。

至于类型,它可以做到这一点,例如这里是一个例子,当代码页是862

 C:\>chcp 862 Active code page: 862 C:\>echo 80|xxd -r -p א C:\>echo 80|xxd -r -p>c:\crp\ii C:\>type c:\crp\ii א C:\>more c:\crp\ii א C:\>xxd -pc:\crp\ii 80 C:\> 

但是你很难找到一个编码到850代码的程序,这是一个相当老式的编码。

更常见的是
C:\ crp> chcp 65001
有效代码页:65001

65001更现代化,使用它可以将文件保存在记事本中,并使用类型在命令提示符下查看。

我设法做了一个我保存在记事本中的文件,当我打字的时候显示效果很好

 C:\blah>file ii<ENTER> ii; Little-endian UTF-16 Unicode text, with no line terminators C:\blah>type ii א C:\blah> C:\blah>xxd -p ii fffed005 C:\blah> 

所以这是一个存储在little endian中的aleph 05d0,即05是一个字节,d0是另一个字节,它首先将其与d0一起存储,因此将其存储为d005

还有FFFE这是一个unicode BOM,我认为这是一种识别UTF-16 LE的特定Unicode编码的方法。

现在,如何使用记事本中的BOM在Unicode 16位LE中保存文件。

打开记事本,键入或粘贴在希伯来语

做文件..保存并选择Unicode(不是BE / big endian)。 只是记事本列为“unicode”,这实际上是真正的16位小端编码。

在这里输入图像说明

当代码页是437时,你仍然可以在文件上使用type命令,但当使用>和<例如type ii >uu<ENTER> type uu<ENTER>时,ch​​cp 65001将有助于type ii >uu<ENTER> type uu<ENTER>如果你敲击type<ENTER>不接受从标准输入(不像“更多”命令),所以你不能做type < ii

类型似乎有点神奇(我的意思是我不太了解它是如何在这些情况下工作的),但它似乎可能会注意代码页,但是在一些条件下工作是相当灵活的,没有想到它会工作。

 C:\blah>chcp 862 Active code page: 862 C:\blah>xxd -p ii fffed005 C:\blah>xxd -p i2.i2 80 C:\blah>type ii <-- funny that this displayed, but ok א C:\blah>type i2.i2 <-- displays fine. type supports that encoding א C:\blah>chcp 65001 Active code page: 65001 C:\blah>type ii <--- i'd expect that to display and it does א C:\blah>type i2.i2 <-- I wouldn't have thought it'd display it and it doesn't   C:\blah>  C:\blah>chcp 862 Active code page: 862 C:\blah>xxd -p ii fffed005 C:\blah>xxd -p i2.i2 80 C:\blah>type ii <-- funny that this displayed, but ok א C:\blah>type i2.i2 <-- displays fine. type supports that encoding א C:\blah>chcp 65001 Active code page: 65001 C:\blah>type ii <--- i'd expect that to display and it does א C:\blah>type i2.i2 <-- I wouldn't have thought it'd display it and it doesn't   C:\blah> 

所以,使用代码页65001,你可以使用它与记事本

或旧式和使用chcp 850,但然后记事本将无法编码的文件

或者经常你不需要打扰代码页的设置,因为很多时候它不会影响类型或其他的东西。 它会影响重定向,stdin和stdout。 但类型不使用标准输入,对于标准输出,屏幕的标准输出似乎工作相当灵活的类型。

添加

chcp 65001是utf-8,这是相关的superuser.com/questions/256196/windows-xp-command-line-encoding提及http://www.sqlsnippets.com/en/topic-13410.html其中提到,“注命令提示符窗口中不支持UTF-16代码页&#x201C;

 D:\Work\Unicode>chcp 1200 Invalid code page D:\Work\Unicode>chcp 1201 Invalid code page 

因此,我们使用记事本中的带有BOM文件的UTF-16 LE,在没有BOM的UTF-8代码页中使用。

你可以说好。 它的工作,罚款..或者你可以尝试将文件转换为UTF-8没有BOM

我试着回显aleph> ff看起来像它输出为utf-8 d790和输出没有BOM

这有点奇怪..类型看代码页..即使它不读取标准输入..

代码页65001实际上是没有BOM的UTF-8,你可以通过这个来测试

 C:\Users\harvey>chcp 65001 Active code page: 65001 C:\Users\harvey>echo א>ff C:\Users\harvey>xxd -p ff d7900d0a C:\Users\harvey>type ff א 

http://www.fileformat.info/info/unicode/char/05d0/index.htm

对于aleph,d790是UTF-8

记事本没有选项保存在没有BOM的UTF-8中

你可以把它转换成..也有一些古怪的事情

 C:\blah>xxd -p fa efbbbfd790 C:\blah>xxd -p fa| cut -c 7- d790 C:\blah>xxd -p fa| cut -c 7-|xxd -r -p <-- strange,but it outputs to a file ok    C:\blah>xxd -p fa| cut -c 7-| xxd -r -p >rw C:\blah>type rw א C:\blah>xxd -p rw <-- and the hex is right d790 C:\blah>  C:\blah>xxd -p fa efbbbfd790 C:\blah>xxd -p fa| cut -c 7- d790 C:\blah>xxd -p fa| cut -c 7-|xxd -r -p <-- strange,but it outputs to a file ok    C:\blah>xxd -p fa| cut -c 7-| xxd -r -p >rw C:\blah>type rw א C:\blah>xxd -p rw <-- and the hex is right d790 C:\blah> 

set是做echo的等效方法,但是不用换行。

 C:\blah><nul set/p=א>gg C:\blah>type gg א C:\blah>xxd -p gg d790 C:\blah> 

所以你可以在记事本中使用BOM制作一个UTF-8文件

它将无法正确打印,但是您可以采取措施将其转换为UTF-8,而不使用BOM,这正是代码页65001的编码

在这里输入图像说明

你可以从cmd创建一个,看看它应该看起来如何

 C:\blah>(echo א& echo א&echo א) C:\blah>(echo א& echo א&echo א)| xxd -p d790200d0ad790200d0ad790200d0a 

您可以使用一些命令将其转换为不带BOM的utf-8

你可以看看你的记事本保存为utf-8与bom的样子

 C:\blah>xxd -p kk efbbbfd7900d0ad7900d0ad7900d0a C:\blah>xxd -p kk| cut -c 7-| xxd -r -p>ta C:\blah>xxd -p ta d7900d0ad7900d0ad7900d0a C:\blah>type ta א א א 

或者您可以接受并使用类型适用于带有BOM的UTF-16 LE的事实,即使代码页是65001,即没有BOM的UTF-8

另一个问题是

显然有在chcp 65001有一些批处理文件不会运行,也许一些C程序也不会工作的错误。 Windows命令行中的Unicode字符 – 如何? 而且我甚至看到cd编译器崩溃时,cmd是在代码页65001(虽然人们可能会责怪c sharp编译器,也可以怪65001) 当我最后离开输出编码为UTF8时为什么csc.exe崩溃?

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

参考: cmd.exe使用什么编码/代码页?

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

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

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

PS我一直无法验证这个解决方案,因为Windows是困难的。 见https://superuser.com/questions/390933/how-to-add-a-font-to-the-cmd-window-choices-in-windows-7-64-bit

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

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

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

现在到cmd控制台

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

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

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

 dir file_name 

如果文件以希伯来字母开头,请参阅通常的输出。 一定是

 dir *file_name 

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

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

 chcp 65001 type that_Notepad_file_I_saved 

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