草庐IT

python - (unicode 错误) 'unicodeescape' 编解码器无法解码字节 - 带有 '\u' 的字符串

coder 2023-05-24 原文

为 Python 2.6 编写代码,但考虑到 Python 3,我认为这是一个好主意

from __future__ import unicode_literals

在一些模块的顶部。换句话说,我是在自找麻烦(为了将来避免它们),但我可能在这里遗漏了一些重要的知识。我希望能够传递一个表示文件路径的字符串并像

一样简单地实例化一个对象

MyObject('H:\unittests')

Python 2.6 中,这工作得很好,无需使用双反斜杠或原始字符串,即使对于以 '\u..' 开头的目录也是如此,这正是我想要的。在 __init__方法我确保所有单个 \出现次数被解释为 ' \\ ',包括特殊字符之前的字符,如 \a , \b , \f , \n , \r , \t\v (只有 \x 仍然是一个问题)。使用(本地)编码将给定的字符串解码为 un​​icode 也可以按预期工作。

Python 3.x 做准备,在编辑器中模拟我的实际问题(从 Python 2.6 中的干净控制台开始),发生以下情况:

>>> '\u'
'\\u'
>>> r'\u'
'\\u'

(到这里为止:'\u' 由控制台使用本地编码进行编码)

>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

换句话说,(unicode) 字符串根本不会被解释为 unicode,也不会使用本地编码自动解码。即使对于原始字符串也是如此:

>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX

u'\u' 相同:

>>> u'\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

另外,我希望 isinstance(str(''), unicode)返回 True (它没有),因为导入 unicode_literals 应该使所有字符串类型都是 unicode。 (编辑:) 因为in Python 3, all strings are sequences of Unicode characters , 我希望 str(''))返回这样的 unicode 字符串和 type(str(''))成为<type 'unicode'> , 和 <type 'str'> (因为所有字符串都是 unicode)但也意识到 <type 'unicode'> is not <type 'str'> .周围一片困惑……

问题

  • 我怎样才能最好地传递包含' \u 的字符串'? (不写'\\u')
  • 是否 from __future__ import unicode_literals真的实现了所有 Python 3. 相关的 unicode 更改,从而得到一个完整的 Python 3 字符串环境吗?

编辑: 在 Python 3 中, <type 'str'> is a Unicode object <type 'unicode'>根本不存在。就我而言,我想为 Python 2(.6) 编写可以在 Python 3 中运行的代码。但是当我 import unicode_literals ,我无法检查字符串是否为 <type 'unicode'>因为:

  • 我假设 unicode不是命名空间的一部分
  • 如果 unicode是命名空间的一部分,<type 'str'> 的文字在同一个模块中创建时仍然是 unicode
  • type(mystring)将始终返回 <type 'str'>用于 Python 3 中的 unicode 文字

我的模块过去使用 # coding: UTF-8 编码为 'utf-8'在顶部发表评论,而我的 locale.getdefaultlocale()[1]返回“cp1252”。所以如果我调用 MyObject('çça')在我的控制台中,它在 Python 2 中被编码为“cp1252”,在调用 MyObject('çça') 时被编码为“utf-8”从模块。在 Python 3 中,它不会被编码,而是一个 unicode 文字。

编辑:

我放弃了在 u 前避免使用“\”的希望。 (或 x 就此而言)。我也了解导入 unicode_literals 的限制.但是,将字符串从模块传递到控制台的许多可能组合,反之亦然,每种不同的编码,除此之外,导入 unicode_literals与否,Python 2 vs Python 3,让我想通过实际测试来创建一个概述。因此下表。

换句话说,type(str(''))不返回 <type 'str'>在 Python 3 中,但 <class 'str'> ,并且似乎避免了所有 Python 2 问题。

最佳答案

AFAIK,from __future__ import unicode_literals 所做的只是将所有 string literals 设为 unicode 类型,而不是 string 类型。那就是:

>>> type('')
<type 'str'>
>>> from __future__ import unicode_literals
>>> type('')
<type 'unicode'>

但是 strunicode 仍然是不同的类型,它们的行为和以前一样。

>>> type(str(''))
<type 'str'>

总是,是 str 类型。

关于您的 r'\u' 问题,这是设计使然,因为它相当于没有 unicode_literals 的 ru'\u'。来自文档:

When an 'r' or 'R' prefix is used in conjunction with a 'u' or 'U' prefix, then the \uXXXX and \UXXXXXXXX escape sequences are processed while all other backslashes are left in the string.

可能来自于词法分析器在 python2 系列中的工作方式。在 python3 中,它可以按照您(和我)的预期工作。

您可以键入两次反斜杠,然后 \u 将不会被解释,但您会得到两个反斜杠!

Backslashes can be escaped with a preceding backslash; however, both remain in the string

>>> ur'\\u'
u'\\\\u'

恕我直言,您有两个简单的选择:

  • 不要使用原始字符串,并转义反斜杠(与 python3 兼容):

    'H:\\unittests'

  • 过于聪明并利用 unicode 代码点(与 python3 兼容):

    r'H:\u005cunittests'

关于python - (unicode 错误) 'unicodeescape' 编解码器无法解码字节 - 带有 '\u' 的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7602171/

有关python - (unicode 错误) 'unicodeescape' 编解码器无法解码字节 - 带有 '\u' 的字符串的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. Ruby 解析字符串 - 2

    我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?

  3. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  4. ruby-on-rails - unicode 字符串的长度 - 2

    在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)

  5. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  6. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  7. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  10. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

随机推荐