代码之家  ›  专栏  ›  技术社区  ›  Craig McQueen Dr. Watson

Python UTF-16输出和Windows行结尾的Bug?

  •  2
  • Craig McQueen Dr. Watson  · 技术社区  · 15 年前

    test.py

    import sys
    import codecs
    
    sys.stdout = codecs.getwriter('utf-16')(sys.stdout)
    
    print "test1"
    print "test2"
    

    然后我将其作为:

    test.py > test.txt
    

    在Windows2000上的Python2.6中,我发现换行符被输出为字节序列 \x0D\x0A\x00 当然,这对于UTF-16是错误的。

    我是遗漏了什么,还是这是一个错误?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Glenn Maynard    15 年前

    换行符转换发生在标准输出文件中。您正在将“test1\n”写入sys.stdout(StreamWriter)。StreamWriter将其转换为“t\x00e\x00s\x00t\x001\x00\n\x00”,并将其发送到实际文件,即原始sys.stderr。

    该文件不知道您已将数据转换为UTF-16;它只知道输出流中的任何\n值都需要转换为\x0D\x0A,这将导致您看到的输出。

        2
  •  3
  •   Glenn Maynard    15 年前

    试试这个:

    import sys
    import codecs
    
    if sys.platform == "win32":
        import os, msvcrt
        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    
    class CRLFWrapper(object):
        def __init__(self, output):
            self.output = output
    
        def write(self, s):
            self.output.write(s.replace("\n", "\r\n"))
    
        def __getattr__(self, key):
            return getattr(self.output, key)
    
    sys.stdout = CRLFWrapper(codecs.getwriter('utf-16')(sys.stdout))
    print "test1"
    print "test2"
    
        3
  •  0
  •   Craig McQueen Dr. Watson    15 年前

    具有 Windows样式的线条端点。

    首先,重定向Python print 使用UTF-16编码的文件的语句(输出Unix样式的行尾):

    import sys
    import codecs
    
    sys.stdout = codecs.open("outputfile.txt", "w", encoding="utf16")
    
    print "test1"
    print "test2"
    

    第二,重定向到 stdout 使用UTF-16编码,没有行尾转换损坏(输出Unix样式的行尾)(感谢 this ActiveState recipe ):

    import sys
    import codecs
    
    sys.stdout = codecs.getwriter('utf-16')(sys.stdout)
    
    if sys.platform == "win32":
        import os, msvcrt
        msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
    
    print "test1"
    print "test2"