2013-02-24 25 views
6

Tôi gặp sự cố khi chuyển đổi chữ in hoa có dấu sang chữ thường.python: lower() german umlauts

print("ÄÖÜAOU".lower()) 

A, O và U được chuyển đổi đúng cách nhưng Ä, Ö và Ü vẫn chữ hoa. Bất kỳ ý tưởng?

Vấn đề đầu tiên là cố định với .decode ('utf-8') nhưng tôi vẫn có một thứ hai:

# -*- coding: utf-8 -*- 
original_message="ÄÜ".decode('utf-8') 
original_message=original_message.lower() 
original_message=original_message.replace("ä", "x") 
print(original_message) 

Traceback (cuộc gọi gần đây nhất cuối cùng): File "Untitled.py", dòng 4, trong original_message = original_message.replace ("a", "x") UnicodeDecodeError: 'ascii' giải mã không thể giải mã byte 0xc3 ở vị trí 0: thứ tự không trong phạm vi (128)

+3

Bạn đang sử dụng python 2 hoặc 3? –

+0

Python 2.7.2 được chuyển bằng OSX. – user2104634

+3

@ user2104634 Có vấn đề của bạn. –

Trả lời

8

Bạn sẽ cần đánh dấu nó như là một chuỗi unicode trừ khi bạn đang làm việc với ASCII đơn giản;

> print(u"ÄÖÜAOU".lower()) 

äöüaou 

Nó hoạt động tương tự khi làm việc với các biến, tất cả phụ thuộc vào loại được gán cho biến để bắt đầu.

> olle = "ÅÄÖABC" 
> print(olle.lower()) 
ÅÄÖabc 

> olle = u"ÅÄÖABC" 
> print(olle.lower()) 
åäöabc 
+0

Tôi có # - * - mã hóa: utf-8 - * - trong dòng đầu tiên, trông giống như phiên bản Python của nó như BlaXpirit gợi ý. – user2104634

+0

@ user2104634 Ví dụ trên được chạy trên Python 2.7.2 chuẩn trên Mac OS X. Nếu không đánh dấu là unicode, nó sẽ chỉ chuyển đổi ký tự ascii thành chữ thường, với dấu 'u', nó cho đầu ra chính xác. –

+0

Vì vậy, thẻ ở đầu là không đủ? – user2104634

2

Bạn đang xử lý chuỗi được mã hóa chứ không phải bằng văn bản unicode.

Phương thức chuỗi byte .lower() chỉ có thể xử lý các giá trị ASCII. Giải mã chuỗi của bạn thành Unicode hoặc sử dụng một unicode chữ (u''), sau đó chữ thường:

>>> print u"\xc4AOU".lower() 
äaou 
+0

@ user2104634: bạn cần đọc [Python Unicode HOWTO] (http://docs.python.org/2/howto/unicode.html); bạn giải mã biến thành giá trị 'unicode' (' variable.decode (encoding ') '). –

1

Nếu bạn đang sử dụng Python 2 nhưng không muốn để tiền tố u "" trên tất cả các chuỗi của bạn đặt này ngay từ đầu chương trình của bạn:

tại
from __future__ import unicode_literals 
olle = "ÅÄÖABC" 
print(olle.lower()) 

sẽ trở lại:

åäöabc 

mã hóa quy định cụ thể như thế nào để giải thích các ký tự đọc từ đĩa vào một progr sáng, nhưng câu lệnh nhập __ tương lai __ cho biết cách diễn giải các chuỗi này trong chính chương trình đó. Có thể bạn sẽ cần cả hai.

Các vấn đề liên quan