【问题标题】:charmap error when encoding Japanese characters编码日文字符时出现charmap错误
【发布时间】:2019-07-24 20:21:46
【问题描述】:

我正在编写一个程序,使用replace() 函数将外部文本文件中的特定日文字符翻译成英文拼写,但我遇到了一个奇怪的错误。

我确保对文本文件中的所有字符进行编码,然后将其放入变量中,然后在该变量上以字节级别启动替换过程,然后再次将其解码为字符串,然后写入新的文本文件。

path = input('Location: ').strip('"')
txt = ''
with open(path,'rb') as f:
    txt = f.read()

def convert(jchar,echar):
    ct = txt.replace(jchar.encode('utf-8'),echar.encode('utf-8'))
    return ct

txt = convert('ぁ','a')
txt = convert('っ','su')

with open('Translated.txt','w') as tf:   
    tf.write(txt.decode('utf-8'))

input('Done.')

如果文本文件包含脚本中可替换的所有日文字符,则一切正常,但如果文本文件包含脚本中不可替换的日文字符,则会出现此错误:

UnicodeEncodeError: 'charmap' codec can't encode character '\u306e' in position 6: character maps to <undefined>

因此,python 在编码后似乎无法再次解码日语字符的字节。

最糟糕的是,甚至还有一些其他非 Unicode 字符,即使我在 python 脚本上将其替换为可替换,我仍然会得到相同的错误,这意味着 python 甚至无法对其进行编码,但我现在主要关注这就是为什么 python 拒绝解码日语字符的字节,尽管它自己能够对其进行编码。

【问题讨论】:

    标签: python non-unicode


    【解决方案1】:

    打开要写入的文件时需要设置正确的编码,如下所示:

    with open('Translated.txt','w', encoding='utf-8') as tf:
    

    Python defaults to a specific encoding 基于您运行它的平台。在 Windows 上,它可能是 ASCII。当您尝试将字符写入文件时,它会尝试将字节解码为 ASCII(或系统默认的任何非 Unicode 编码)字符串,但该字节没有 ASCII 字符,因此失败.

    当您替换字符时它起作用的原因是罗马字符可以写为 ASCII,并且因为当您尝试写入文件时会发生错误。如果您查看打印的 Traceback,您会确切地看到它发生的位置:

    Traceback (most recent call last):
      File ".\sandbox.py", line 61, in <module>
        tf.write(txt.decode('utf-8'))
      File "[...]\Python\Python37\lib\encodings\cp1252.py", line 19, in encode
        return codecs.charmap_encode(input,self.errors,encoding_table)[0]
    UnicodeEncodeError: 'charmap' codec can't encode character '\u3041' in position 11: character maps to <undefined>
    

    【讨论】:

    • 这样做会给我带来其他错误,我只是从修复 iut 的最后一行中删除 .decode('utf-8'),但我不知道为什么,你能解释一下吗? >
    • 它甚至自动解码了新文本文件中的字节
    • 我不知道,抱歉。
    【解决方案2】:

    我找到了一个解决方法,但我不知道它为什么会起作用,我从最后一行中删除了 .decode('utf-8') 并解决了整个问题,即使是我提到的最糟糕的问题,我认为as 方法对字节进行自动解码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-22
      • 2016-11-14
      • 2015-11-21
      • 1970-01-01
      • 2021-08-14
      • 2013-02-17
      相关资源
      最近更新 更多