在Python中将Unicode字符串转换为字符串(包含额外符号)

时间:2009-07-30 15:41:12

标签: python string unicode type-conversion

如何将Unicode字符串(包含£$等额外字符)转换为Python字符串?

11 个答案:

答案 0 :(得分:539)

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'

答案 1 :(得分:303)

如果您不需要翻译非ASCII字符,可以使用encode to ASCII:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

答案 2 :(得分:127)

>>> text=u'abcd'
>>> str(text)
'abcd'

如果字符串只包含ascii字符。

答案 3 :(得分:110)

如果您有Unicode字符串,并且想要将其写入文件或其他序列化表单,则必须先将编码成为可以存储的特定表示形式。有几种常见的Unicode编码,例如UTF-16(对大多数Unicode字符使用两个字节)或UTF-8(1-4字节/代码点,取决于字符),等等。要将该字符串转换为特定编码,可以使用:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

这个原始字节串可以写入文件。但请注意,在阅读它时,您必须知道它所使用的编码并使用相同的编码对其进行解码。

写入文件时,您可以使用codecs模块摆脱此手动编码/解码过程。因此,要打开将所有Unicode字符串编码为UTF-8的文件,请使用:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

请注意,使用这些文件的任何其他内容必须了解文件的编码方式,如果他们想要阅读它们。如果您是唯一一个读/写的人,这不是问题,否则请确保您使用其他任何使用该文件的形式都可以理解。

在Python 3中,这种形式的文件访问是默认的,内置的open函数将采用编码参数并始终转换为Unicode字符串(Python 3中的默认字符串对象)文件模式下打开的文件。

答案 4 :(得分:56)

以下是一个例子:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

答案 5 :(得分:5)

好吧,如果您愿意/准备切换到Python 3(您可能不会因为某些Python 2代码的向后兼容性而导致),您不必进行任何转换; Python 3中的所有文本都用Unicode字符串表示,这也意味着不再使用u'<text>'语法。实际上,你还有一些字节串,用于表示数据(可能是一个编码的字符串)。

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(当然,如果您当前正在使用Python 3,那么问题可能与您尝试将文本保存到文件的方式有关。)

答案 6 :(得分:3)

这是一个示例代码

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

答案 7 :(得分:1)

文件包含Unicode字符串

d = 0
e = 0
i = 0
p = 0
q = 0
r = 0
s = 0
t = 0
grades = []
lp = []
speicher = []



txt = input("Welche Note möchtest du eintragen? 'quit' zum Abbrechen: ")
while txt != "quit":
 grades.extend(txt)
 txt = input("Welche Note möchtest du eintragen? 'quit' zum Abbrechen: ")
txt2 = input("Welche Leistungspunkte möchtest du eintragen? 'quit' zum Abbrechen: ")
while txt2 != 'quit':
 lp.extend(txt2)
 txt2 = input("Welche Leistungspunkte möchtest du eintragen? 'quit' zum Abbrechen: ")  
n = len(grades)     #n = Länge von Grades
print("Länge von grades ist: ",n)

listgesamt = grades + lp

while i <= len(grades) - 1:                 #Noten multipliziert mit Leistungspunkten und abgespeichert in "speicher"
 a = int (listgesamt[n+i])
 b = int (listgesamt[0+i])
 c = a * b
 speicher.extend(str(c)
 i += 1
while p <= len(speicher) - 1:               #Summe des Zählers der Berechnung (alle Noten+Lp addiert)
 d = int (speicher[0+p])
 e += d
 p += 1
while q <= len(lp) - 1:                     #Alle Leistungspunkte addiert
 r = int (lp[0+q])
 s += r
 q += 1
t = sum(int(lp))  # FUNKTIONIERT NE!  
print("Der Notendurchschnitt beträgt: ",e/t)  # e geteilt durch die Gesamtzahl an verteilten L 

对我

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

答案 8 :(得分:0)

对于我的情况,没有答案。我有一个包含unicode字符的字符串变量,并且这里没有解释的encode-decode起作用。

如果我在终端机上做

int coords = (y << 16) + x;
IntPtr lParam = new IntPtr(coords);
PostMessage(hwnd, WM_LBUTTONDOWN, IntPtr.Zero, lParam);
PostMessage(hwnd, WM_LBUTTONUP, IntPtr.Zero, lParam);

[DllImport("user32.dll", SetLastError = true)]
static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

const Int32 WM_LBUTTONDOWN = 0x201;
const Int32 WM_LBUTTONUP = 0x202;

echo "no me llama mucho la atenci\u00f3n"

输出正确:

python3
>>> print("no me llama mucho la atenci\u00f3n")

但是使用脚本加载此字符串变量无法正常工作。

这是解决我的问题的方法,以防万一:

output: no me llama mucho la atención

答案 9 :(得分:0)

有一个可以解决Unicode问题的库,称为 ftfy 。使我的生活更轻松。

示例1

module.exports = {
  lifecycles: {
    async afterCreate(result, data) {
      const administrators = await strapi.query("strapi::user").find({
        isActive: true,
        blocked: false,
        "roles.code": "strapi-super-admin",
      });
      const emails = administrators.map((a) => a.email);
      await strapi.plugins["email"].services.email.send({
        to: emails,
        from: "robot@strapi.io",
        subject: "New message from contact form",
        text: `
          Yay! We've got a new message.
          User's name: ${result.name}.
          Phone: ${result.phone}.
          Email: ${result.email}.
          Message: ${result.text}.

          You can also check it out in Messages section of admin area.
        `,
      });
    },
  },
};

示例2-UTF-8

import ftfy
print(ftfy.fix_text('ünicode'))

output -->
ünicode

示例3-Unicode 代码点

import ftfy
print(ftfy.fix_text('\xe2\x80\xa2'))

output -->
•

https://ftfy.readthedocs.io/en/latest/

pip安装ftfy

https://pypi.org/project/ftfy/

答案 10 :(得分:-2)

import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars