如何在 Python 3 中读取未以 utf-8 编码的字符串

How reading strings not encoded in utf-8 in Python 3

提问人:Massimo Manca 提问时间:5/9/2023 更新时间:5/9/2023 访问量:58

问:

在我的应用程序中,我有 6 个 SQL INSERT 字符串,其中包含德语、法语、西班牙语、英语、俄语和意大利语的文本数据。我使用 SQLiteStudio(在 64 位 Win 7 操作系统上运行)从填充的表中获取 SQL 字符串。这是德语字符串:

#---------------------------------------------------------------------------
# \file deHelpData.py 
# \brief
#
# \version rel. 1.0
# \date Created on 2023-05-08
# \author massimo
# Copyryght (C) 2023 organization_name. All rights reserved.
#---------------------------------------------------------------------------
#!/usr/bin/python
# encoding: windows-1252

deHelpQryStr = str(''' 
    INSERT INTO deHelp (
           text,
           tag,
           id
       )
       VALUES (
           'Dies ist die Anleitung der Emuse -App. Klicken Sie auf die Schaltfläche Links, um auf die Schaltfläche zur Hauptseite zurückzukehren, um die Sprachreproduktion zu suspendieren oder fortzusetzen. Klicken Sie auf die rechte Schaltfläche. Die Emuse -App besteht aus 5 Seiten, jeweils ihren eigenen Titel oben sichtbar. Diese Version, die für das Gramsci Birthplace Museum in Ales angepasst wurde, umfasst die Funktionen von Audioguida, gleichzeitige Übersetzung, Navigation und Hilfe. Alle Funktionen sind im Hauptmenü zugänglich, indem Sie auf die jeweilige Schaltfläche klicken. Die Real -Time -Übersetzungsfunktion ist nur aktiv, indem sie sich im und in der Nähe des Museums befinden, während die anderen Funktionen immer aktiv sind. Wenn Sie oben auf die erste Schaltfläche klicken, greifen Sie auf die Funktion des Audiohandbuchs zu, die die Kamera aktiviert. Im Museum wurden QR -Codes in der Nähe der Interessenspunkte ähnlich wie beim Herunterladen der App gescannt. Durch die Rahmung eines QR -Codes wird die Reproduktion des Audios in Bezug auf die Arbeit, auf die sie sich bezieht, aktiviert. Wenn Sie auf die zweite Schaltfläche klicken, überfahren Sie in Echtzeit zur Seite der Vokalübersetzungsfunktion. Wenn Sie auf die Schaltfläche links klicken, wählen Sie hier Ihre Zunge aus und klicken Sie kurz auf die zentrale Rolle. Übersetzen. Die Sprache, in der Sie übersetzen möchten, ist immer italienisch. Die Audio -Reproduktion in der übersetzten Sprache beginnt, wenn sie zum Sprechen endet. Für eine gute Operation der Übersetzung ist es notwendig, ohne lange Unterbrechungen zwischen den Wörtern oder den nachfolgenden Sätzen zu sprechen. Im Hauptmenü wird durch Klicken auf die dritte Schaltfläche die Navigationsfunktion aktiviert. Das Ziel ist mit den Koordinaten des Museums voreingestellt. Wenn Sie auf die zentrale Schaltfläche klicken, beginnt die Navigation. Indem Sie kurz auf das grüne Signal klicken, werden die Koordinaten und die ungefähre Adresse dessen, wo Sie sich befinden, angezeigt. Indem Sie kurz auf das rote Signal klicken, erscheinen die Koordinaten und die Adresse des Museums. Wenn Sie lange auf das rote Zeichen klicken, werden die grundlegenden Informationen des Museums angezeigt. Mit dem Navigator können Sie die beste Route zwischen der Position, in der Sie sich befinden, und dem Museum berechnen, indem Sie die Transportmittel zwischen Auto, Fahrrad zu Fuß und für die behinderten Rollstühle auswählen. Wenn Sie mit dem Fragepunkt auf die letzte Schaltfläche klicken, wird dieser Text angezeigt, der ebenfalls gelesen wird. Klicken Sie links auf die Schaltfläche, um das Lesen oder auf die rechts auf die Seite zu beenden, um die Seite zu beenden.',
           'help',
           1
       ),
       (
           'Die Emuse unterstützt nicht die Sprache auf Ihrem Smartphone. Bitte wählen Sie eine der unterstützten Sprachen, indem Sie auf die entsprechende Schaltfläche klicken.',
           'lang',
           2
       ),
       (
           'Wählen Sie die Sprache, in der Sie Ihre Stimme übersetzen möchten, indem Sie auf die entsprechende Schaltfläche klicken.',
           'langTo',
           3
       ),
       (
           'Willkommen in Emide. Wenn Sie die App zum ersten Mal verwenden, empfehle ich Ihnen, mit dem Fragestalk auf die Schaltfläche zu klicken, die Ihnen bei der ersten Verwendung hilft. Wenn Sie andererseits die App bereits kennen, um die Audiohandbuch zu verwenden, klicken Sie auf die erste Schaltfläche oben, für den gleichzeitigen Übersetzer im zweiten, für den Navigator auf dem dritten.',
           'main',
           4
       ),
       (
           'Audioguide',
           'guideTitle',
           5
       ),
       (
           'Hilfe',
           'helpTitle',
           6
       ),
       (
           'Hauptmenü',
           'mainTitle',
           7
       ),
       (
           'Navigator',
           'navigatorTitle',
           8
       ),
       (
           'Übersetzer',
           'translatorTitle',
           9
       );
    ''', "cp1252")
#---------------------------------------------------------------------------

但是当 Python 解释器加载字符串时,会产生以下错误:

SyntaxError:(unicode 错误)“utf-8”编解码器无法解码位置 178 中的字节0xe4:无效的延续字节

我需要做些什么才能正确使用这个字符串? 谢谢 马西莫

python-3.x 字符串 utf-8

评论


答:

1赞 Mark Tolonen 5/9/2023 #1

该行声明文件的编码,并且必须是文件的第一行或第二行(请参阅 PEP 263 - 定义 Python 源编码)。该文件实际上必须保存在 Windows-1252 中才能与声明匹配。或者,以 UTF-8 编码(这是 Python 3 源文件的默认编码)保存文件,然后删除该行。# encoding: windows-1252# encoding

此外,该行应为文件中的第一行才能生效。#!/usr/bin/python

没有必要。这通常会将 Windows-1252 中编码的字节字符串转换为 Unicode 字符串,但您的字符串已经是 Unicode 字符串。str(..., encoding='cp1252')

评论

0赞 Andj 5/14/2023
同样,如果源代码是 Windows-1252,则数据库表需要使用 的字符集,并且排序规则应设置为 或 。latin1latin1_german1_cilatin1_german2_ci
0赞 Mark Tolonen 5/14/2023
@Andj 源代码编码声明仅影响源文件中文本 Unicode 字符串中字节的解释。套接字、文件、数据库等使用的编码可以不同。此外,Windows-1252 与 Latin1 编码不同。
0赞 Andj 5/22/2023
我的观点很简单,一切都需要相同的编码、源数据、数据库表、源代码等。 是的,ISO-8859-1 和 Windows-1252 是不同的编码,Latin-1 是 ISO-8859-1 的别名,但并非总是如此。对于数据库,他们谈到了字符集和排序规则,尽管字符集可能不是最准确的含义标签。sqlite对大多数RDBMS的排序方法最原始。如果将 Web 添加到组合中,则 iso-8859-1 将被视为 Windows-1252 的别名,而不是像其他一些数据库那样被视为单独的编码。