2011-07-15 7 views
27

Có phương pháp phổ biến nào để phát hiện bộ mã chuỗi không? Tôi sử dụng thẻ IPTC và không có mã hóa đã biết. Tôi cần phải phát hiện nó và sau đó thay đổi chúng thành utf-8.Python - phát hiện bộ ký tự và chuyển đổi thành utf-8

Bất kỳ ai cũng có thể trợ giúp?

+0

Nhìn nhận xét của bạn về @Ignacio, tôi mời bạn dán một vài ví dụ về chuỗi "Không" vào câu hỏi của bạn để chúng tôi có thể chơi với họ và hiểu vấn đề là gì. Sẽ rất hữu ích nếu bạn cũng có thể dán phiên bản đã giải mã chính xác của mình như đã hoàn thành trên cổng mà bạn đã đề cập. – mac

Trả lời

31

Bạn muốn sử dụng chardet, một máy dò mã hóa

+2

Nó không hoạt động, tôi trierd nó trước khi yêu cầu ở đây. Một số chuỗi nhận được Không mã hóa nhưng không đúng. Thẻ được mã hóa bằng cách nào đó vì trên 1 cổng web chúng được nhận dạng. – robos85

+0

+1: chardet có vẻ là một trong những cách tốt nhất để phát hiện mã hóa. @ robos85: Không thể thực hiện phát hiện mã hóa hoàn hảo: http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file/ 436299 # 436299. – EOL

+1

Tôi đã phát triển một cách thành công hơn nhiều trong việc phát hiện mã hóa, dựa trên việc biết ngôn ngữ. Nó nhận được mã hóa 8 bit ngay. Cuối cùng. – tchrist

13

Đó là hơi muộn, nhưng đó cũng là một giải pháp: cố gắng sử dụng pyicu.

Một ví dụ:

import icu 
def convert_encoding(data, new_coding='UTF-8'): 
    coding = icu.CharsetDetector(data).detect().getName() 
    if new_coding.upper() != coding.upper(): 
     data = unicode(data, coding).encode(new_coding) 
    return data 
+0

pyicu dựa trên icu và đôi khi sẽ bỏ lỡ phát hiện một số mã hóa: http://sourceforge.net/p/icu/mailman/icu-design/thread/[email protected]com/ – coanor

+5

@coanor: * bất kỳ trình phát hiện mã hóa nào sẽ thất bại trong một số trường hợp, vì không có cách nào để xác định chính xác mã hóa cho tất cả các kiểm tra – MestreLion

2

Có một module gọi là cchardet

Nó được cho là nhanh hơn so với chardet.

Lưu ý rằng nó đòi hỏi Cython

11

Nếu bạn muốn làm điều đó với cchardet, bạn có thể sử dụng chức năng này.

import cchardet 
def convert_encoding(data, new_coding = 'UTF-8'): 
    encoding = cchardet.detect(data)['encoding'] 

    if new_coding.upper() != encoding.upper(): 
    data = data.decode(encoding, data).encode(new_coding) 

    return data