Articles of unicode

如果一个命令行程序不确定stdout的编码,它应该输出什么编码?

我有一个用Python编写的命令行程序,当我通过命令行上的另一个程序pipe理它时, sys.stdout.encoding是None 。 这是有道理的,我想 – 输出可能是另一个程序,或者一个文件,你redirect到,或者其他什么,它不知道什么编码是需要的。 但我也不是! 这个程序将以不同的方式被许多不同的人使用(幽默我)。 我应该玩它安全,只输出ascii(用问号replace非ASCII字符)? 或者我应该输出UTF-8,因为这些日子如此普遍?

我如何重新添加一个unicode字节顺序标记在linux中?

我有一个相当大的SQL文件,以FFFE的字节顺序标记开始。 我已经使用unicode感知的linux拆分工具将此文件拆分为100,000行块。 但是,当它们返回给窗口时,它不会像第一个窗口以外的任何部分那样,因为只有它具有FFFE字节顺序标记。 我怎样才能使用回声(或任何其他bash命令)添加这两个字节的代码?

使用iconv将UTF8转换为UTF16

当我使用iconv从UTF16转换为UTF8时,一切都很好,反之亦然。 我有这些文件: a-16.strings: Little-endian UTF-16 Unicode c program text a-8.strings: UTF-8 Unicode c program text, with very long lines 编辑器中的文本看起来OK。 当我运行这个: iconv -f UTF-8 -t UTF-16LE a-8.strings > b-16.strings 然后我得到这个结果: b-16.strings: data a-16.strings: Little-endian UTF-16 Unicode c program text a-8.strings: UTF-8 Unicode c program text, with very long lines file实用程序不显示预期的文件格式,并且文本在编辑器中看起来不太好。 难道这是iconv不会创build正确的BOM? 我在MAC命令行上运行它。 为什么不是正确的UTF-16LE格式的B – 16? […]

Java运行时不支持编码“UTF-8”

每当我在SUN Java(构build1.6.0_10-rc2-b32和其他1.6.x版本)下启动基于Apache Felix(OSGi)的应用程序时,我在控制台(通常在Ubuntu 8.4下)看到以下消息输出: 警告:Java运行时不支持编码“UTF-8”。 我在运行Tomcat和Resin的时候偶尔会看到这个消息。 如果java支持unicode和UTF-8,那么这个消息是什么原因呢? 我还没有find任何参考,或在任何其他地方的答案。

什么是argv的编码?

我不清楚在C的argv中使用了哪些编码。 特别是,我对以下情况感兴趣: 用户使用区域设置L1来创build名称N包含非ASCII字符的文件 稍后,用户使用语言环境L2在命令行上制表该文件的名称,将其作为命令行参数提供给程序P P在命令行上看到什么字节序列? 我观察到,在Linux上,在UTF-8语言环境中创build文件名,然后在(例如) zw_TW.big5语言环境中对其进行zw_TW.big5似乎会导致我的程序P被送入UTF-8而不是Big5 。 但是,在OS X上,相同的一系列操作会导致我的程序P获取Big5编码的文件名。 以下是我认为目前为止(长时间,我可能是错的,需要纠正): 视窗 文件名以一些Unicode格式存储在磁盘上。 所以Windows取名为N ,从L1(当前代码页)转换为N的Unicode版本,我们将调用N1 ,并将N1存储在磁盘上。 我后来假设的是,当后面的选项卡完成时,名称N1被转换为区域L2(新的当前代码页)以供显示。 幸运的是,这将产生原来的名字N – 但是如果N包含在L2中不可表示的字符,这将是不正确的。 我们称之为新名字N2 。 当用户实际按下回车键以运行该参数时,名称N2被转换回Unicode,再次产生N1 。 这个N1现在可以通过GetCommandLineW / wmain / tmain以UCS2格式提供给程序,但GetCommandLine / main用户将在当前语言环境(代码页)中看到名字N2 。 OS X 就我所知,磁盘存储的故事是一样的。 OS X将文件名称存储为Unicode。 对于Unicodeterminal,我认为terminal会在Unicode缓冲区中build立命令行。 因此,当您完成选项卡时,它会将该文件名作为Unicode文件名复制到该缓冲区。 运行该命令时,该Unicode缓冲区将转换为当前语言环境L2,并通过argv传送给程序,程序可以将当前语言环境的argv解码为Unicode以显示。 Linux的 在Linux上,一切都不一样,我对发生的事情感到非常困惑。 Linux将文件名存储为字节string ,而不是Unicode。 所以,如果在locale L1中创build一个名称为N的文件, N作为字节string是存储在磁盘上的文件。 当我以后运行terminal并尝试并完成名称时,我不确定会发生什么情况。 它在我看来像命令行被构造为一个字节缓冲区,文件的名称作为一个字节string被串联到该缓冲区。 我假定当你input一个标准字符时,它会被dynamic地编码成附加到该缓冲区的字节。 当你运行一个程序时,我认为这个缓冲区是直接发送给argv 。 现在, argv有什么编码? 它看起来像在命令行中键入的任何字符,而在语言环境中L2将采用L2编码,但文件名将采用L1编码 […]

Linux / Python:编码用于打印的unicodestring

我有一个相当大的Python 2.6应用程序,大量的打印语句洒了。 我在整个使用Unicodestring,它通常很好。 但是,如果我redirect的应用程序的输出(如“myapp.py> output.txt”),那么我偶尔会得到这样的错误: UnicodeEncodeError: 'ascii' codec can't encode character u'\xa1' in position 0: ordinal not in range(128) 我想如果有人把LOCALE设置为ASCII,也会出现同样的问题。 现在,我完全理解这个错误的原因。 在我的Unicodestring中有不能用ASCII编码的字符。 很公平。 但是我希望我的python程序尽最大努力去打印可以理解的东西,可能是跳过可疑字符或用Unicode标识replace它们。 这个问题一定是常见的…处理这个问题的最佳做法是什么? 我更喜欢一个解决scheme,让我继续使用普通的“打印”,但我可以修改所有事件,如果有必要。 PS:我现在已经解决了这个问题。 解决scheme既不是给出的答案。 我使用了http://wiki.python.org/moin/PrintFails中给出的方法,由ChrisJ在其中一个注释中给出。 也就是说,我用一个包含正确参数的unicode编码的包装来replacesys.stdout。 工作得很好。

了解Python Unicode和Linuxterminal

我有一个Python脚本,写入一些UTF-8编码的string。 在我的脚本中,我主要使用str()函数来强制转换为string。 看起来像这样: mystring="this is unicode string:"+japanesevalues[1] #japanesevalues is a list of unicode values, I am sure it is unicode print mystring 我不使用Pythonterminal,只是标准的Linux Red Hat x86_64terminal。 我设置terminal输出utf8字符。 如果我执行这个: #python myscript.py this is unicode string: カラダーズ ソフィー 但是,如果我这样做: #python myscript.py > output 我得到了典型的错误: UnicodeEncodeError: 'ascii' codec can't encode characters in position 253-254: ordinal not in range(128) […]

如何使用* nix中的控制台工具将\ uXXXX unicode转换为UTF-8

我使用curl获得一些URL响应,这是JSON响应,它包含unicode转义的国家字符,如\u0144 (ń)和\u00f3 (ó) 。 我如何将它们转换为UTF-8或任何其他编码保存到文件?

NTFS中的文件名是以什么编码存储的?

我刚开始使用一些编程来处理WinXP系统上非英文名称的文件名。 我已经做了一些关于unicode的推荐阅读,我想我已经有了基本的想法,但是有些部分对我来说还不是很清楚。 具体来说,什么编码(UTF-8,UTF-16LE / BE)是存储在NTFS中的文件名 (不是内容,而是文件的实际名称)? 是否有可能打开任何文件使用fopen(),这需要一个字符*,或者我别无select,只能使用wfopen(),它使用wchar_t *,大概需要一个UTF-16string? 我尝试手动喂养一个UTF-8编码的stringfopen(),例如。 unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // 가.txt FILE* f = fopen((char*)filename, "wb+"); 但是这是作为'ê°€.txt'出来的。 我的印象(这可能是错误的),一个UTF8编码的string就足以打开Windows下的任何文件名,因为我似乎隐约记得一些Windows应用程序传递(char *),而不是(wchar_t *),并有没问题。 任何人都可以点亮这个?

C ++ Windows十进制到UTF-8字符转换

我一直在使用下面的函数将Unicode字符的十进制表示转换为C ++中的UTF8字符本身。 我目前的function在Linux / Unix系统上运行良好,但在Windows上不断返回错误的字符。 void GetUnicodeChar(unsigned int code, char chars[5]) { if (code <= 0x7F) { chars[0] = (code & 0x7F); chars[1] = '\0'; } else if (code <= 0x7FF) { // one continuation byte chars[1] = 0x80 | (code & 0x3F); code = (code >> 6); chars[0] = 0xC0 | (code & 0x1F); […]