Tôi có khoảng 1000 tên tệp được đọc bởi
import logging
def force_decode[string, codecs=['utf8', 'cp1252']]:
for i in codecs:
try:
return string.decode[i]
except UnicodeDecodeError:
pass
logging.warn["cannot decode url %s" % [[string]]]
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = force_decode[item]
print item
8, một số trong số chúng được mã hóa bằng UTF8 và một số là CP1252Nội dung chính Hiển thị
- Làm cách nào để biết mã hóa của một chuỗi?
- Làm cách nào để kiểm tra xem tệp có phải là UTF không
- Làm cách nào để kiểm tra xem một chuỗi có phải là Unicode không?
- làm gì. mã hóa làm gì trong Python?
Tôi muốn giải mã tất cả chúng thành Unicode để xử lý thêm trong tập lệnh của mình. Có cách nào để mã hóa nguồn giải mã chính xác thành Unicode không?
Thí dụ
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = item.decode['cp1252'] # or item = item.decode['utf-8']
print item
BartoszKP
33. 8k13 huy hiệu vàng103 huy hiệu bạc128 huy hiệu đồng
đã hỏi ngày 10 tháng 4 năm 2013 lúc 6. 14
0
Sử dụng thư viện chardet. nó siêu dễ
import chardet
the_encoding = chardet.detect['your string']['encoding']
và thế là xong
trong python3, bạn cần cung cấp loại byte hoặc bytearray để
import chardet
the_encoding = chardet.detect[b'your string']['encoding']
đã trả lời 5 tháng 8 năm 2017 lúc 19. 08
george george
1.60015 huy hiệu bạc16 huy hiệu đồng
8
nếu các tệp của bạn ở dạng
import logging
def force_decode[string, codecs=['utf8', 'cp1252']]:
for i in codecs:
try:
return string.decode[i]
except UnicodeDecodeError:
pass
logging.warn["cannot decode url %s" % [[string]]]
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = force_decode[item]
print item
9 và import json
json.detect_encoding[b"Hello"]
0, thì có một cách dễ dàngimport logging
def force_decode[string, codecs=['utf8', 'cp1252']]:
for i in codecs:
try:
return string.decode[i]
except UnicodeDecodeError:
pass
logging.warn["cannot decode url %s" % [[string]]]
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = force_decode[item]
print item
mặt khác, có một bộ ký tự phát hiện lib
Python - phát hiện bộ ký tự và chuyển đổi thành utf-8
https. //pypi. con trăn. org/pypi/chardet
đã trả lời 10 tháng 4 năm 2013 lúc 6. 27
lucemia lucemia
6.0975 huy hiệu vàng39 huy hiệu bạc74 huy hiệu đồng
0
Bạn cũng có thể sử dụng gói
import json
json.detect_encoding[b"Hello"]
1 để phát hiện mã hóaimport json
json.detect_encoding[b"Hello"]
đã trả lời 5 tháng 5 năm 2021 lúc 12. 51
Suyog Shimpi Suyog Shimpi
6121 huy hiệu vàng7 huy hiệu bạc15 huy hiệu đồng
0
Mã hóa được phát hiện của
import chardet
the_encoding = chardet.detect['your string']['encoding']
0 có thể được sử dụng để giải mã một mảng phụ mà không có bất kỳ ngoại lệ nào, nhưng chuỗi đầu ra có thể không chính xácĐối với một lập trình viên PHP hay MySQL, mọi thứ có vẻ khá dễ dàng và thoải mái khi làm việc với dữ liệu chỉ bao gồm các ký tự tiếng Anh. Cho đến khi bạn vướng vào sự cố rắc rối của mã hóa UTF-8 trong xử lý ngôn ngữ không phải tiếng Anh. Nói sơ lược về mã hóa UTF-8 thì đây là một ký tự mã hóa kiểu của ký tự Unicode. Nó được thiết kế để tương thích ngược với mã hóa ASCII và tránh những nhược điểm của UTF-16 và UTF-32. UTF-8 trở thành kiểu mã hóa phổ biến và sử dụng ưu tiên thay thế khi hơn một nửa số trang web hiện tại sử dụng kiểu mã hóa này. Trong bài viết này, sẽ có 3 hướng dẫn chính được trình bày để có thể sử dụng mã hóa UTF-8 trong PHP và MySQL
- Change in file config
2 and PHP codeimport json json.detect_encoding[b"Hello"]
- Thay đổi trong cấu hình tệp
3 và các vấn đề liên quan khác đến MySQLimport json json.detect_encoding[b"Hello"]
- Thay đổi dữ liệu trong cơ sở dữ liệu MySQL sử dụng mã hóa latin1 thành mã hóa UTF-8
PHP và mã hóa UTF-8
Để sử dụng UTF-8 là ký tự mã hóa mặc định, thay đổi ở tệp cấu hình
import json
json.detect_encoding[b"Hello"]
2 như sau. import json
json.detect_encoding[b"Hello"]
5 Change in PHP codeat header
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
0Trong tệp XML
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
1 Tuy nhiên, không phải tất cả các ký tự UTF-8 đều được chấp nhận trong XML, vì vậy cần loại bỏ các ký tự này. Một hàm hữu ích sau đây có thể giải quyết vấn đề trên________số 8Trọng HTML
- nội dung HTML.
2$link = mysql_connect['localhost', 'user', 'password']; mysql_set_charset['utf8', $link];
- biểu mẫu HTML.
3$link = mysql_connect['localhost', 'user', 'password']; mysql_set_charset['utf8', $link];
Chỉ định UTF-8 trong hàm hmlspecialchars
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
4Khi kết nối với MySQL
Sử dụng hàm
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
5 $link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
Từ PHP 5. 5. 0, hàm
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
5 được thay thế bởi $link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
7import chardet
the_encoding = chardet.detect['your string']['encoding']
6Sử dụng hàm xử lý chuỗi tương thích với UTF-8
Có nhiều hàm sẽ gặp lỗi hoặc xử lý sai khi một ký tự cần nhiều hơn 1 byte [chẳng hạn như UTF-8]. Ví dụ hàm
$link = mysql_connect['localhost', 'user', 'password'];
mysql_set_charset['utf8', $link];
8 sẽ trả về số lượng byte chứ không phải ký tự số lượng. Để giải quyết vấn đề này có 2 tùy chọn- Sử dụng các hàm
9 [ví dụ. `iconv_strlen,…]. Dù vậy, bản thân chuỗi ký tự vẫn cần phải đảm bảo được mã hóa đúng$link = mysql_connect['localhost', 'user', 'password']; mysql_set_charset['utf8', $link];
- Tiện ích mở rộng
60. extension cung cấp một tập tin đầy đủ các hàm cho việc xử lý mã hóa sử dụng nhiều byte [multibyte]import chardet the_encoding = chardet.detect['your string']['encoding']
MySQL với mã hóa UTF-8
Change in file config my. ban đầu
import chardet
the_encoding = chardet.detect[b'your string']['encoding']
0- MySQL UTF-8 thực sự chỉ là một phần của ký tự UTF-8 file khi chỉ sử dụng tối đa 3 byte trong khi mã hóa UTF-8 yêu cầu 4 byte. Do đó, một số ký tự không được hỗ trợ trong MySQL UTF-8. Move from MySQL 5. 5. 3, điều này có thể được giải quyết đối với tập ký tự
61import chardet the_encoding = chardet.detect['your string']['encoding']
- Trong trường hợp không cài đặt mã hóa khi kết nối với MySQL, sau khi kết nối xong, có thể sử dụng lệnh/truy vấn sau.
62import chardet the_encoding = chardet.detect['your string']['encoding']
- Khi xác định kích thước của các trường kiểu varchar, đừng quên UTF-8 yêu cầu 4 byte trên mỗi ký tự
Chuyển đổi dữ liệu bằng cách sử dụng mã hóa latin1 sang UTF-8
- Thiết lập cài đặt tại file config
3 như hướng dẫn thứ 2import json json.detect_encoding[b"Hello"]
- Thực hiện câu lệnh sau.
64tên-db-của-bạnimport chardet the_encoding = chardet.detect['your string']['encoding']
65import chardet the_encoding = chardet.detect['your string']['encoding']
- Xác nhận mọi thứ đã được cài đặt về UTF-8
66import chardet the_encoding = chardet.detect['your string']['encoding']
- Tạo kết xuất tệp cho việc chuyển đổi.
67import chardet the_encoding = chardet.detect['your string']['encoding']
- Thay thế bộ ký tự trong kết xuất tệp từ latin1 sang UTF-8 Ví dụ sử dụng Perl.
68 Đối với người dùng Windows. Chuyển đổi có thể được thực hiện bằng WordPad sử dụng chức năng tìm và thay thếimport chardet the_encoding = chardet.detect['your string']['encoding']
- Kể từ giờ, việc thay đổi sẽ được thực hiện trên cơ sở dữ liệu nên đảm bảo sao lưu dữ liệu trước khi thực hiện
69import chardet the_encoding = chardet.detect['your string']['encoding']
- Tìm kiếm những bản ghi có thể bị chuyển đổi sai và sửa đổi chúng [ví dụ những ký tự được mã hóa 2 lần]. Vì các ký tự không phải ASCII là nhiều byte [sử dụng nhiều hơn 1 byte/ký tự] nên có thể tìm thấy chúng bằng cách so sánh số lượng byte và số lượng ký tự
- Kiểm tra xem có ký tự multi-byte hay không [nếu truy vấn sau đó trả về 0 thì không có ký tự multi-byte và có thể bỏ qua các bước tiếp theo]
00import chardet the_encoding = chardet.detect[b'your string']['encoding']
- Sao chép các hàng có ký tự nhiều byte sang bảng tạm thời
import logging
def force_decode[string, codecs=['utf8', 'cp1252']]:
for i in codecs:
try:
return string.decode[i]
except UnicodeDecodeError:
pass
logging.warn["cannot decode url %s" % [[string]]]
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = force_decode[item]
print item
0- Chuyển đổi ký tự đã được mã hóa UTF-8 2 lần về định dạng UTF-8 chuẩn. Vì MySQL đã tự động chuyển đổi dữ liệu sang UTF-8 một lần nữa trên dữ liệu UTF-8 nên cần một “thủ thuật” nhỏ để tránh việc chuyển đổi này. Đầu tiên, chuyển đổi kiểu mã hóa về latin1, mã hóa đó 2 lần sẽ bị loại bỏ.
01 Lưu ý. Can set true data type. Như ví dụ trên làimport chardet the_encoding = chardet.detect[b'your string']['encoding']
02 Vấn đề bây giờ là nếu cài đặt cột hiện tại về mã hóa UTF-8, MySQL sẽ chuyển đổi từ latin1 về UTF-8. Để tránh việc này, chúng ta thay đổi kiểu dữ liệu của cột vềimport chardet the_encoding = chardet.detect[b'your string']['encoding']
03 rồi sau đó mới cài đặt UTF-8. Điều này được hưởng lợi từ việc MySQL không chuyển đổi kiểu mã hóa của mộtimport chardet the_encoding = chardet.detect[b'your string']['encoding']
03import chardet the_encoding = chardet.detect[b'your string']['encoding']
import logging
def force_decode[string, codecs=['utf8', 'cp1252']]:
for i in codecs:
try:
return string.decode[i]
except UnicodeDecodeError:
pass
logging.warn["cannot decode url %s" % [[string]]]
for item in os.listdir[rootPath]:
#Convert to Unicode
if isinstance[item, str]:
item = force_decode[item]
print item
5- Loại bỏ các hàng chỉ có ký tự byte đơn [sử dụng một byte] ra khỏi bảng tạm thời.
05import chardet the_encoding = chardet.detect[b'your string']['encoding']
- Replace data into main table
06import chardet the_encoding = chardet.detect[b'your string']['encoding']
- Tra cứu dữ liệu còn lại, nếu cần thì thực hiện lại từ bước 7
Lời kết
Mã hóa dữ liệu yêu cầu xử lý trọng và tỉ lệ. Nếu hiểu rõ về nó, lập trình viên có thể tiết kiệm một khoảng thời gian và công sức đáng kể khi đối mặt với những vấn đề về dữ liệu. Bài viết này như một lần khẳng định nữa định tầm quan trọng của công việc đã cân nhắc khi định nghĩa bộ ký tự trong dự án cũng như môi trường phát triển ngay từ ban đầu