将字符串编码为 utf-8 将非英文字符保留为字节字符串

encoding string to utf-8 leaves non english characters as byte strings

我正在尝试将 snscrape 用于 twitter,它将推文内容存储为字符串。我正在尝试将其保存到文本文件中,但这并没有以正确的方式解析非英文字符。

import snscrape.modules.twitter as sntwitter
# Creating list to append tweet data to
tweets_list1 = []
# Using TwitterSearchScraper to scrape data 
for i,tweet in enumerate(sntwitter.TwitterSearchScraper('from:eenadulivenews').get_items()):
    if i>maxTweets:
        break
    print(tweet.content)

这里tweet.content是一个字符串。 我正在尝试使用

之类的命令行将其保存到文件中
python main.py > output.txt

这给了我一个错误说

UnicodeEncodeError: 'charmap' codec can't encode characters in position 5-10: character maps to <undefined>

所以我试图将其转换为 utf-8,因为我的推文是使用一种 utf-8 支持的语言。

import snscrape.modules.twitter as sntwitter
# Creating list to append tweet data to
tweets_list1 = []
# Using TwitterSearchScraper to scrape data 
for i,tweet in enumerate(sntwitter.TwitterSearchScraper('from:eenadulivenews').get_items()):
    if i>maxTweets:
        break
    print(tweet.content.encode('utf-8'))

这可行,但它将非英文字符保留为字节字符串。像这样

b'\xe0\xb0\x86 \xe0\xb0\xb5\xe0\xb0\x82\xe0\xb0\x9f\xe0\xb0\xb2\xe0\xb0\x95\xe0\xb1\x81 242 \xe0\xb0\x95\xe0\xb1\x8b\xe0\xb0\x9f\xe0\xb1\x8d\xe0\xb0\xb2\xe0\xb0\xae\xe0\xb0\x82\xe0\xb0\xa6\xe0\xb0\xbf \xe0\xb0\xb5\xe0\xb1\x80\xe0\xb0\x95\xe0\xb1\x8d\xe0\xb0\xb7\xe0\xb0\x95\xe0\xb1\x81\xe0\xb0\xb2\xe0\xb1\x81\n\xe0\xb0\xaf\xe0\xb1\x82\xe0\xb0\x9f\xe0\xb1\x8d\xe0\xb0\xaf\xe0\xb1\x82\xe0\xb0\xac\xe0\xb0\xb0\xe0\xb1\x8d\xe2\x80\x8c... \xe0\xb0\x88 \xe0\xb0\x98\xe0\xb0\xa8\xe0\xb0\xa4\xe0\xb0\xb2\xe0\xb0\xa8\xe0\xb1\x8d\xe0\xb0\xa8\xe0\xb1\x80 62 \xe0\xb0\x8f\xe0\xb0\xb3\xe0\xb1\x8d\xe0\xb0\xb2 \xe0\xb0\xa8\xe0\xb0\xbf\xe0\xb0\xb7\xe0\xb0\xbe \xe0\xb0\xae\xe0\xb0\xa7\xe0\xb1\x81\xe0\xb0\xb2\xe0\xb0\xbf\xe0\xb0\x95 \xe0\xb0\xb8\xe0\xb0\xbe\xe0\xb0\xa7\xe0\xb0\xbf\xe0\xb0\x82\xe0\xb0\x9a\xe0\xb0\xbf\xe0\xb0\xa8\xe0\xb0\xb5\xe0\xb1\x87.

英文字符解析正确。

当我在编码设置为 'utf-8'

的记事本中打开它们时,这在 cmd 和文本文件上是相同的

如何获取所有非英文字符?我在 windows 11.

从某种意义上说,我想知道您是否没有完全理解 UTF-8。不是“英语”的字符(我假设你的意思本质上是 ASCII)仍然以 UTF-8 编码为 8 位组。为了将所有 Unicode 放入 8 位组中,其中许多将被推入更长的表示形式。因为无论使用何种语言,Unicode 都代表世界上的大部分字符,以 UTF-8 编码字符串仅意味着您将拥有许多看起来不“正确”的字符,即使它们是有效的 UTF-8。我建议首先阅读(所有内容)维基百科 UTF-8 定义。

也许我错了(它确实发生了),但可能是因为您要求的是一个简单的转换,没有对应的英语版本。

print(tweet.content.encode('utf-8')) 以人类可读的 ASCII 兼容形式写入字节字符串(数据,而非文本)(前导 b 表示字节字符串,非 ASCII 字节值 >127表示为十六进制转义码 \xNN) 而不是您想要的。

如果使用输出重定向,Python 可以使用环境变量告知使用什么编码将文本转换为适合文件的字节流:

set PYTHONIOENCODING=utf8
python main.py > output.txt

您也可以直接将数据写入指定编码的文件,而不是使用重定向:

with open('tweet.txt','w',encoding='utf8') as f:
    f.write(tweet.content)