1

我试过了iorepr()等等,它们不起作用!

输入问题å ( \xe5)

(这些都不起作用)

import sys
print(sys.stdin.read(1))


sys.stdin = io.TextIOWrapper(sys.stdin.detach(), errors='replace', encoding='iso-8859-1', newline='\n')
print(sys.stdin.read(1))


x = sys.stdin.buffer.read(1)
print(x.decode('utf-8'))

他们都给我粗略的UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe5 in position 0: unexpected end of data

还尝试使用以下命令启动 Python:export PYTHONIOENCODING=utf-8也不起作用。


现在,这就是我所在的位置:

import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
sys.stdin = codecs.getwriter("utf-8")(sys.stdin.detach())

x = sys.stdin.read(1)

print(x.decode('utf-8', 'replace'))

这给了我:�
它很接近......

我怎样才能\xe5把它变成å我的控制台?没有它input()也会破坏,因为这个解决方案会破坏它。

注意:我知道以前有人问过这个问题,但没有一个能解决它.. 尤其是 io


我的系统的一些信息

os.environ['LANG'] == 'C'
sys.getdefaultencoding() == 'utf-8'
sys.stdout.encoding == 'ANSI_X3.4-1968'
sys.stdin.encoding == 'ANSI_X3.4-1968'

我的操作系统:ArchLinux运行xterm
Runninglocale -a给了我:C | POSIX | sv_SE.utf8

我遵循了这些:

(还有 50 多个)

解决方案(有点,仍然中断input()

sys.stdout = codecs.getwriter("latin-1")(sys.stdout.detach())
sys.stdin = codecs.getwriter("latin-1")(sys.stdin.detach())

x = sys.stdin.read(1)

print(x.decode('latin-1', 'replace'))
4

2 回答 2

1

您正在运行它,默认情况下xterm 支持 UTF-8。运行它xterm -u8或使用它uxterm来修复它。

另一种解决方法是使用不同的语言环境。将您的语言环境设置为 Latin-1,例如:

export LANG=sv_SE.ISO-8859-1

但是与 Unicode 标准的全部范围(数百万)相比,您被限制为 256 个代码点。

请注意,Python 2 从未解码输入;写出您从终端读取的内容看起来不错,因为您读取的原始字节由终端在同一语言环境中解释;读取和写入 Latin-1 字节就可以了。然而,这与处理 Unicode 数据并不完全相同。

于 2013-08-15T20:24:32.893 回答
0

在 Python3 中采用编程方法,而不是更改终端编解码器:

import sys, codecs
sys.stdout = codecs.getwriter("latin-1")(sys.stdout.detach())
sys.stdin = codecs.getwriter("latin-1")(sys.stdin.detach())
sys.stdout.write(sys.stdin.read(1).decode('latin-1', 'replace'))

这不仅使您选择/匹配您的终端“编码”,它实际上不需要外部影响(例如export LANG=sv_SE.ISO-8859-1)。

唯一的缺点

input('something: ')

将打破,修复它是:

# Since it's bad practice to name function the
# same as __builtins__, we'll go ahead and call it something
# we're used to but isn't in use any more.
def raw_input(txt):
    sys.stdout.write(txt)
    sys.stdout.flush()
    sys.stdin.flush()
    return sys.stdin.readline().strip()

非常感谢Martijn说出原因,事实上数据是 latin-1 的!

于 2013-08-15T20:42:12.287 回答