Python - 如何为 UTF-8 编码的文本添加换行符?

Python - How to add line breaks to UTF-8 encoded text?

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

UnicodeEncodeError: 'charmap' codec can't encode character '\u2192' in position 21348:

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

当然编码后,换行符变成了一串'\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: expected a bytes-like object, not 'str'

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

所以主要问题是,如何将换行符返回到我的 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 变量,就在这里。

没有 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"
   />
   
   →

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

您可以将 str 变量转换为类字节:

your_string_variable.encode()

但是您没有提供任何 Python 代码,所以我说的可能不是解决方案。所以检查 Google search results for your error. For example, you can find .

与其自己对数据进行编码,不如让 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 三明治”方法)。