Articles of unicode

在python中对非英文文件名进行文件操作

这个问题可能会被我们很多人所面对,但我在unicode处理方面很差。 这是问题:这是一个代码片段,我试图执行.exe文件,并检查文件path是否存在,但没有运气: #Python 2.6.7 filePath = 'C:\\Test\\' # Test folder haveing file BitComet_比特彗星_1_25.exe for (adir, dirs, files) in os.walk(rootdir): for f in files: path = os.path.join(adir,f) if os.path.exists(path ): print'Path Found',path #Extract file #logging(path ) else: print 'Path Not Found' #logging(path ) 我总是得到'未findpath'的结果。 我试图使用path.decode('utf-8'): 但脚本读取文件path为: C:\Test\BitComet_????_1_25.exe 而且由于这个文件path不存在,所以它转到else分支。 请给我一个提示,以处理这个unicode问题,以及它是否更好,如果我能够显示用户在cmd或日志文件中显示文件path。 我很抱歉,如果这似乎是一个重复的职位。

使用std :: wifstream读取具有特殊字符的unicode文件

在Linux环境下,我有一段读取unicode文件的代码,如下所示。 但是,特殊字符(如丹麦字母æ,ø和å)处理不正确。 对于'abcæøåabc'这一行,输出就是'abc'。 使用debugging器,我可以看到wline的内容也只是a\000b\000c\000 。 #include <fstream> #include <string> std::wifstream wif("myfile.txt"); if (wif.is_open()) { //set proper position compared to byteorder wif.seekg(2, std::ios::beg); std::wstring wline; while (wif.good()) { std::getline(wif, wline); if (!wif.eof()) { std::wstring convert; for (auto c : wline) { if (c != '\0') convert += c; } } } } wif.close(); 任何人都可以告诉我如何让它读取整个行? 感谢致敬

wchar_t在Linux上的UTF-16?

在Linux上使用wchar_t*来存储UTF-16编码文本是否有意义? 显而易见的问题是,Linux上的wchar_t是四个字节,UTF-16每个字符通常需要两个(或者两个两个一组两个)字节。 我正在尝试使用第三方库,确实如此,这似乎很混乱。 看起来事情是搞砸了,因为在Windows上wchar_t是两个字节,但我只是想仔细检查,因为这是一个非常昂贵的商业图书馆,可能是我只是不明白的东西。

C / C ++中的跨平台unicode:使用哪种编码?

我目前正在开发一个应该在Windows和Linux上工作的业余爱好项目(C / C ++),全面支持Unicode。 可悲的是,Windows和Linux使用不同的编码,使我们的生活更加困难。 在我的代码中,我试图尽可能地使用数据,使Windows和Linux都变得简单。 在Windows中,默认情况下,wchar_t被编码为UTF-16,在Linux中被编码为UCS-4(如果我错了,请纠正我的错误)。 我的软件打开({_wfopen,UTF-16,Windows},{fopen,UTF-8,Linux})并将数据写入UTF-8文件。 到目前为止,这都是可行的。 直到我决定使用SQLite。 SQLite的C / C ++接口允许一个或两个字节的编码string( 单击 )。 当然这在Linux中不适用于wchar_t,因为Linux中的wchar_t默认是4字节。 因此,从sqlite的写入和读取需要转换为Linux。 目前,代码在Windows / Linux的例外情况下正在混乱。 我希望坚持在wchar_t中存储数据的标准思想: Windows中的wchar_t:文件path没有问题,读写sqlite没有问题。 无论如何,将数据写入文件应该使用UTF-8。 Linux中的wchar_t:由于UTF-8编码导致的文件pathexception,读/写到sqlite(wchar_t)之前的转换,以及将数据写入文件时的相同。 读完( 在这里 )我确信我应该坚持在Windows中的wchar_t。 但是在完成所有工作之后,麻烦就从移植到Linux开始了。 目前我正在考虑重做这一切,以坚持简单的字符(UTF-8),因为它适用于Windows和Linux,记住,我需要'WideCharToMultiByte'在Windows中的每个string来实现UTF-8。 使用简单的基于char *的string将大大减lessLinux / Windows的例外数量。 你有任何跨平台unicode的经验吗? 任何关于简单地将数据存储在UTF-8而不是使用wchar_t的想法?

如果一个命令行程序不确定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。 工作得很好。