Avatar
0
vubao Beginner
vubao Beginner
So sánh xâu tiếng việt
Chào mọi người, trong quá trình xử lý text, đọc và so sánh chuỗi thì mình gặp vấn đề như sau : có 2 string nhìn bằng mắt thường thì giống nhau, nhưng khi encode sang utf-8 thì nó cho ra 2 chuỗi binary khác nhau ,ví dụ trên python 3:

s1 = 'Nguyễn Đình Bách'

s1.encode('utf-8') = b'Nguyxc3xaaxccx83n xc4x90ixccx80nh Baxccx81ch'

s2 = 'Nguyễn Đình Bách'

s2.encode('utf-8') = b'Nguyxe1xbbx85n xc4x90xc3xacnh Bxc3xa1ch'

Nên s1 == s2 sẽ cho ra False. Vậy mình muốn hỏi với những string về mắt thường nhìn giống nhau nhưng encode khác nhau như trên thì có cách nào xử lý để phép so sánh s1_daxuly == s2_daxuly ra kết quả là True không.

Cám ơn mọi người đã đọc bài.

  • Answer
python unicode
Remain: 5
2 Answers
Avatar
monkey Beginner
monkey Beginner
Của anh chạy bình thường:

Python 3.8.10 (default, May  4 2021, 03:06:52) 
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> s1 = 'Nguyễn Đình Bách'
>>> print(s1.encode('utf-8'))
b'Nguy\xc3\xaa\xcc\x83n \xc4\x90i\xcc\x80nh Ba\xcc\x81ch'
>>> s2 = 'Nguyễn Đình Bách'
>>> print(s2.encode('utf-8'))
b'Nguy\xc3\xaa\xcc\x83n \xc4\x90i\xcc\x80nh Ba\xcc\x81ch'
>>> print(s1 == s2)
True
  • 0
  • Reply
Anh thử lại như này đi ạ :

s1 = b'Nguyxc3xaaxccx83n xc4x90ixccx80nh Baxccx81ch'.decode('utf8')

s2 = b'Nguyxe1xbbx85n xc4x90xc3xacnh Bxc3xa1ch'.decode('utf8')

print(s1)

print(s2)

s1 == s2

 –  vubao 1630469251000
Bạn có thể dùng lib Unidecode để khử dấu tiếng Việt trước khi so sánh nhé:

import unidecode

s1 = b’Nguy\xc3\xaa\xcc\x83n \xc4\x90i\xcc\x80nh Ba\xcc\x81ch’.decode(‘utf8′)
s2 = b’Nguy\xe1\xbb\x85n \xc4\x90\xc3\xacnh B\xc3\xa1ch’.decode(‘utf8’)

unidecode.unidecode(s1) == unidecode.unidecode(s2)

 –  Vu Luong Anh 1630487872000
Cám ơn bạn, nhưng cách này có nhược điểm là khi so sánh để map 2 danh sách thì dẫn đến những người tên Hùng sẽ trùng với những người tên Hưng chẳng hạn: unidecode.unidecode('Hùng') == unidecode.unidecode('Hưng')  –  vubao 1630529081000
Hình như 2 xâu của em đang gõ bằng 2 bộ gõ khác nhau đúng không em? Anh đang thấy nó bị encode ra kết quả khác nhau  –  tvd12 1630546914000
E cũng đoán vậy, đây là 2 đoạn text đọc từ 2 file Excel xuất ra trên 2 hệ thống khác nhau, cần so sánh theo tên để map thông tin từ file này sang file kia ạ.  –  vubao 1630565366000
Avatar
vubao Beginner
vubao Beginner
E cũng đoán vậy, đây là 2 đoạn text đọc từ 2 file Excel xuất ra trên 2 hệ thống khác nhau, để map thông tin từ file này sang file kia.
  • 1
  • Reply