【问题标题】:Python - How to add line breaks to UTF-8 encoded text?Python - 如何在 UTF-8 编码文本中添加换行符?
【发布时间】:2021-04-08 22:00:54
【问题描述】:

我没有包含我的代码,因为只有在我尝试使用某个 html 文件时才会出现问题。该文件的使用给了我错误:

UnicodeEncodeError:“charmap”编解码器无法在位置 21348 编码字符“\u2192”:

我创建的用于测试程序的简单 html 文件不会发生这种情况。我可以在 utf-8 中对有问题的文件进行编码,这允许我在 Python 中将 html 用作字符串,但我没有运气将换行符重新放入字符串中。

当然,在编码之后,换行符变成了'\n'的字符串,而不是换行符。意思是我的代码块如下所示:

<!DOCTYPE html>
<html lang="en">

  <head>
   <meta charset="utf-8" />
   <meta
     name="viewport"
     content="width=device-width, initial-scale=1, shrink-to-fit=no"
   />

变成这样:

<!DOCTYPE html>\n<html lang="en">\n  <head>\n    <meta charset="utf-8" />\n    <meta\n      name="viewport"\n      content="width=device-width, initial-scale=1, shrink-to-fit=no"\n    />\n

我认为有一种简单的方法可以恢复换行符,但我没有找到任何示例。 replace() 函数没有帮助我到达任何地方,它给了我错误:

TypeError: 需要一个类似字节的对象,而不是 'str'

老实说,我实际上并不知道如何向函数传递“类似字节”的对象。我尝试过的每个类似字节的对象都给了我另一个错误。

所以主要问题是,如何让换行符重新回到我的 UTF-8 字符串中?

但是奖励积分如果有人能告诉我为什么我会收到 UnicodeEncodeError。位置 21348 中的字符只是一个“l”,但它位于此代码块中,如果这有帮助的话。然而,字符 u/2192 是一个 → 向右箭头。提前致谢。

<!--
    <div class="service-icon text-center">
      <img src="../assets/img/service/2.png" alt="" />
    </div>
 -->

编辑

相关python代码:

import data

enc_data = data.encode('utf-8')

#use of enc_data
for item in new_items:
    item.strip()
    pathlib.Path(file_dir, f"{item}.html").write_text(f"{enc_data}\n")

这就是我所能看到的与 Unicode 错误相关的全部内容。我只使用一次 enc_data 变量,就在这里。

【问题讨论】:

  • 你定义了编码类型吗?像“f = open('index.html', 'w', encoding='utf-8').write(your html string)”?
  • @Epsi95 我正在使用来自另一个模块的文本作为字符串。我导入了该变量,然后对其进行了编码。例如:从 pyindex 导入数据 | enc_data = data.encode('utf-8') |然后是 .write_text(f"{enc_data}\n")。应该这样做不应该吗?
  • 向我们展示您如何打开您正在调用.write() 的文件。您的错误消息涉及charmap 编码,可能是latin-1 或windows-1252,具体取决于您的平台。如果您将 UTF-8 写入需要 latin-1 或 windows-1252 的文件,您将得到该错误。
  • 不要使用 .write_text(f"{enc_data}\n")。当您对字符串进行编码时,这意味着您正在使用给定格式制作该字符串的字节。由于您使用的是 f 字符串,因此应解码为 .write_text(f"{enc_data.decode()}\n")
  • @Epsi95 我已经尝试过了,但不幸的是它让我回到了 UnicodeEncodeError。

标签: python html unicode utf-8 character-encoding


【解决方案1】:

与其自己编码数据,不如让 pathlib 来做:

import data


#use of enc_data
for item in new_items:
    item.strip()
    pathlib.Path(file_dir, f"{item}.html").write_text(f"{data}\n", encoding='utf-8')

否则 pathlib 将尝试使用系统的默认编码,它无法处理右箭头字符。

通常,如果您主要处理文本,最好在应用程序的边缘进行解码和编码,并使用str 数据(这称为“unicode 三明治”方法)。

【讨论】:

  • 这很好用,谢谢,你知道我可以为我的替换行函数文本参数做同样的事情吗? || replace_line(f'./realfolder/files/{item}.html', 9, f' {item} ' + '\n') ||这似乎是我最后的障碍。我需要为我的 replace_line 函数实现编码参数吗?
  • 由于您系统的默认编码不是 UTF-8,因此您需要在读取或写入文件时提供编码。很可能(尤其是如果您遇到异常指出编码是一个问题)。
【解决方案2】:

错误TypeError: expected a bytes-like object, not 'str' 意味着您应该将变量转换为类似字节的形式。因此,最好的问题是: “如何将 str 变量转换为 bytes-like?”

您可以使用以下方法将 str 变量转换为类似字节的形式:

your_string_variable.encode()

但是您没有提供任何 Python 代码,所以也许我所说的不是解决方案。所以检查Google search results 是否有错误。例如,您可以找到this answer

【讨论】:

    【解决方案3】:

    没有MCVE,很难检测到您在做什么。但是\n 代表换行符。它的显示方式取决于您如何解释字符串,例如

    a = '''<!DOCTYPE html>
    <html lang="en">
    
      <head>
       <meta charset="utf-8" />
       <meta
         name="viewport"
         content="width=device-width, initial-scale=1, shrink-to-fit=no"
       />
       
       \u2192'''
    
    
    #on python console
    a
    #gives:
    '<!DOCTYPE html>\n<html lang="en">\n\n  <head>\n   <meta charset="utf-8" />\n   <meta\n     name="viewport"\n     content="width=device-width, initial-scale=1, shrink-to-fit=no"\n   />→'
    
    
    #and
    print(a)
    #gives:
    <!DOCTYPE html>
    <html lang="en">
    
      <head>
       <meta charset="utf-8" />
       <meta
         name="viewport"
         content="width=device-width, initial-scale=1, shrink-to-fit=no"
       />
       
       →
    

    【讨论】:

    • 我已经添加了一个例子,我希望它足够有意义。我有点像调用 print 到一个单独的文件,但是 Unicode 错误阻止我向该新文件写入任何内容。如果它在 utf-8 中,则将整个字符串写入文件。只有完全没有换行符才能使它无法使用。
    猜你喜欢
    • 2015-08-15
    • 2011-06-11
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2015-10-21
    • 2017-05-16
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多