Chuyển đổi tệp UTF-8 sang ASCII (nỗ lực cao nhất)


23

Tôi có một tệp trong UTF-8 chứa các văn bản bằng nhiều ngôn ngữ. Rất nhiều trong số đó là tên của mọi người. Tôi cần chuyển đổi nó sang ASCII và tôi cần kết quả để có vẻ tốt nhất có thể.

Có nhiều cách để tiếp cận chuyển đổi từ mã hóa rộng hơn sang hẹp hơn. Việc chuyển đổi đơn giản nhất sẽ là thay thế tất cả các ký tự không phải ASCII bằng một số trình giữ chỗ, như '_'. Nếu tôi biết ngôn ngữ mà tập tin được viết, có những khả năng bổ sung, như tiếng La-tinh.

Công cụ Unix hoặc thư viện ngôn ngữ lập trình nào có sẵn trên Unix có thể mang lại cho tôi một sự chuyển đổi (nỗ lực tốt nhất) từ UTF-8 sang ASCII?

Hầu hết các văn bản là ở châu Âu, ngôn ngữ dựa trên tiếng Latin.


1
bạn có biết ngôn ngữ nào bắt đầu không? Ví dụ, có một sự khác biệt về cách xử lý không có sẵn của một âm sắc (như trên ö). Trong Đức bạn luôn có thể viết "oe", nhưng ví dụ ở Hà Lan không có sẵn các âm sắc tốt hơn có thể được "mô tả" bởi một dấu gạch ngang tiếp theo là nhân vật umlauted (và có những "oe" sẽ là một nhị trùng âm hoàn toàn khác nhau)
Anthon

Làm thế nào để bạn xác định được một cách tốt nhất có thể như thế nào? Khó khăn thực sự là trong việc xác định ánh xạ. So với đó, nhiệm vụ lập trình là tầm thường. Các ánh xạ thực sự được sử dụng rất khác nhau và có thể là ngôn ngữ cụ thể theo hai cách: chúng phụ thuộc vào ngôn ngữ của văn bản và ngôn ngữ giả định của người đọc (đặc biệt là liên quan đến La Mã hóa).
Jukka K. Korpela

@ JukkaK.Korpela "càng tốt càng tốt" tất nhiên được định nghĩa bởi những người đã tạo ra "công cụ Unix hoặc thư viện ngôn ngữ lập trình có sẵn trên Unix" mà tôi đang yêu cầu. Nếu điều tốt nhất tôi sẽ nhận được là thay thế mọi thứ không phải ASCII bằng dấu gạch dưới, thì tôi không thể làm gì khác. Ngoại trừ việc viết công cụ của riêng tôi, mà tôi sẽ không. Tôi đoán Unix @ SO có thể không phải là nơi tốt nhất cho câu hỏi này
user7610

1
@ user7610 Khác iconvtr, có Unidecode . Tôi không quen thuộc với nó, nhưng nó có thể làm những gì bạn muốn, nếu bạn có thể sử dụng Python.
yellowantphil

1
@yellowantphil hoặc nút-unidecode trong JavaScript / nút, UnidecodeSharp trong C♯ hoặc Text :: Unidecode trong Perl, là tên đầu tiên của tên này. Tôi đoán có những phiên bản khác.
user7610

Câu trả lời:


11
konwert utf8-ascii

Nó sẽ thực hiện chuyển đổi nỗ lực tốt nhất, tùy thuộc vào các bảng chuyển đổi. Nếu bạn biết khoảng ngôn ngữ nhập, có các bộ lọc ngôn ngữ cụ thể cho kết quả tốt hơn, ví dụ:

konwert utf8-xmetodo

là sự chuyển đổi Esperanto thành đại diện x-metodo,

konwert UTF8-tex

sẽ cố gắng thực hiện biểu diễn TeX của dấu phụ, có các tham số cụ thể của ngôn ngữ:

konwert UTF8-ascii/de

sẽ phiên âm "ä" thành "ae" (theo thông lệ của tiếng Đức) thay vì đơn giản là "a"

konwert UTF8-ascii/rosyjski

sẽ sử dụng các quy tắc tiếng Ba Lan để phiên âm tiếng Nga, thay vì các quy tắc "giống như tiếng Anh", v.v ...


Đây có phải là vị trí mới nhất của konwerttrang web? Nó được đóng gói ở bất cứ đâu? github.com/taw/konwert/tree/master/konwert-1.8
Nemo

25

Điều này sẽ làm việc cho một số điều:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLITtrả lại helloe ?. Bất kỳ nhân vật nàoiconv nào không biết cách chuyển đổi sẽ được thay thế bằng dấu hỏi.

iconvlà POSIX, nhưng tôi không biết liệu tất cả các hệ thống có TRANSLITtùy chọn không. Nó hoạt động với tôi trên Linux. Ngoài ra, IGNOREtùy chọn sẽ âm thầm loại bỏ các ký tự không thể được biểu diễn trong bộ ký tự đích (xem man iconv_open).

Một tùy chọn kém hơn nhưng tuân thủ POSIX là sử dụng tr. Lệnh này thay thế tất cả các điểm mã không phải ASCII bằng dấu chấm hỏi. Nó đọc văn bản UTF-8 một byte mỗi lần. Có thể thay thế bằng É É Tùy, E?hoặc ?tùy thuộc vào việc nó được mã hóa bằng cách sử dụng dấu kết hợp hoặc ký tự được phân tách trước.

echo café äëïöü | tr -d '\200-\277' | tr '\300-\377' '[?*]'

Ví dụ đó trả về caf? ?????, sử dụng các ký tự được phân tách trước.


trkhông có nghĩa là làm việc một byte mỗi lần. GNU tr có, nhưng đó là một lỗi.
Stéphane Chazelas

3
iconv -f utf-8 -t ascii//TRANSLITlàm việc tốt cho tôi Nó thay đổi dấu ngoặc kép thành dấu ngoặc kép thẳng. Cảm ơn.
Đại tá Panic

Lưu ý rằng iconv sẽ bóp nghẹt các ký tự có dấu nặng như Bính âm.
sventechie

Lưu ý rằng //TRANSLITcũng hoạt động cho các bộ ký tự khác, ví dụ iso-8859-1//TRANSLIT.
Skippy le Grand Gourou

iconvđưa iconv: illegal input sequence at position 1234và cắt các tập tin cho tôi. Sẽ rất tuyệt nếu nó chỉ xóa nhân vật và cố gắng chọn lại chuỗi.
jozxyqk


2

Tôi có một tệp trong UTF-8 chứa [tên người] bằng nhiều ngôn ngữ [mà tôi muốn chuyển đổi thành thứ gì đó có ý nghĩa trong ASCII].

Bạn có nghĩa là bạn muốn có thể chuyển đổi các tên sau đây thành một chuỗi ASCII mà người liên quan sẽ không phản đối?

  • ராமானுஜன் ஐயங்கார்
  • عبد الله الاني بن السين

Tôi nghi ngờ không có công cụ tự động có thể làm điều này. Có thể không có hoặc có rất nhiều chữ Latin hóa tên cá nhân. Phần mềm không thể chọn phiên bản văn hóa chấp nhận được. Ít nhất không phải không có phần mềm biết rất nhiều về văn hóa của người liên quan.

Xem thêm /programming//a/1398403/477035


2
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'tạo ra `` bd llh lthny bn lHsyn`, phiên âm đủ tốt cho mục đích của tôi.
user7610

4
@ user7610: Tốt thôi nhưng Vua Abdulla II của Jordan có thể không đồng ý. Tôi sẽ chuẩn bị một lời giải thích trong trường hợp ai đó quan trọng phàn nàn với CEO :-)
RedGrittyBrick

2

Tôi đã kết thúc bằng cách sử dụng Perl với Text :: Unidecode cho việc này. Thí dụ:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

sản xuất bd llh lthny bn lHsyn, đó là kết quả chấp nhận được cho mục đích của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.