Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)相关的知识,希望对你有一定的参考价值。
我有一个宽字符文件(希伯来文本)在记事本中看起来很好(以“UTF-8编码”保存),在Notepad ++中读得很好,当我复制并粘贴到MS Word时它看起来也很好。但是当我打开一个“DOS框”(Windows控制台)并转到:“输入file.txt”时,它会打印出乱码。 是的,我在Windows控制台上完成了对Unicode的所有建议:我使用“cmd / u”打开控制台,我将字体更改为Lucida,然后输入:“chcp 65001”。 运行Windows 7的PC和运行Windows XP SP3的另一台PC上的问题完全相同。
Font 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是默认值。 Raster是默认值,未在此处列出,可能是因为它是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(即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之外,命令提示符中不支持大部分或全部带希伯来语的字体。事实上,命令提示符不支持大多数字体完全停止,甚至不是“新罗马时代”(因为“新罗马时代”不是单倍间隔/固定宽度,而且这是它的许多标准之一支持,其他标准似乎更加模糊。
现在,您可以在命令提示符中添加和选择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或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?
注意 - 这个答案的早期版本有一些命令行示例,但它们不必要地复杂。我可能会在某些时候添加一些命令来演示我所描述的内容,但它相当简单。
/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的其他界面。
你应该在file.txt
之前将type file.txt
转换为UTF-16(Little Endian)
参考:What encoding/code page is cmd.exe using?
当你说“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
如何获得希伯来语的XP安装?
首先,这是关于XP家庭SP3,启用希伯来语。我的意思是它是标准的XP US安装,或者我相信,增加了希伯来语键盘和显示功能。我相信每张XP CD都可以安装这样的系统。特别是,我相信以下是这样一个系统所需要的:
- 控制面板 - >日期,时间,语言和区域选项 - >语言和区域选项 - >在语言选项卡中:1)单击详细信息并添加希伯来语键盘。 2)使用V标记复杂脚本和从右到左语言(包括泰语)选项的安装文件。
- 控制面板 - >日期,时间,语言和区域选项 - >语言和区域选项 - >在高级选项卡中:接受,标记为V,10004(MAC - 阿拉伯语)和10005(Mac - 希伯来语)。不确定阿拉伯语是否必须在这里。
现在到cmd控制台
如前所述,必须将Courier New字体显式添加到控制台字体注册表中。否则,将不会显示明确的希伯来字体。
现在当打开cmd控制台时,为了输入希伯来字符,所有要做的就是启用Courier New字体,并将键盘更改为希伯来语模式。让Windows滚动键盘的语言很容易。重复按下左Alt和左移键,或用鼠标。
另外,dir命令将显示具有希伯来字符的文件名。但是,人们不能只发出一个
dir file_name
如果文件以希伯来字母开头,则查看通常的输出。肯定是
di以上是关于Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)的主要内容,如果未能解决你的问题,请参考以下文章
Unicode / UTF-8文本文件:Windows控制台上的乱码(试图显示希伯来语)
Unicode (UTF-8) 在 Python 中读取和写入文件