2009-04-30 43 views
5

Tôi đang trên Mac Os X 10.5 (nhưng tôi sao chép các vấn đề trên 10,4)Làm thế nào để khắc phục vấn đề lạ với iconv trên Mac OS X

Tôi cố gắng để sử dụng iconv để chuyển đổi một UTF- 8 tập tin để aSCII

file utf-8 chứa các ký tự như 'EAC'

tôi muốn các ký tự có dấu để được biến thành ascii gần nhất của họ tương đương

nên

lệnh của tôi là thế này:

iconv -f UTF-8 ASCII -t // TRANSLIT // IGNORE myutf8file.txt

đó hoạt động tốt trên một máy Linux

nhưng trên Mac OS XI địa phương của tôi nhận ví dụ này:

è => 'e

à => `một

Tôi thực sự không undersatnd tại sao iconv trả về kết quả kỳ lạ này trên mac os x nhưng tất cả là tốt trên linux

bất kỳ sự giúp đỡ? hoặc chỉ đường?

cảm ơn trước

+0

đầu ra bạn nhận được trên Linux là gì? – kch

+0

và bạn thấy lạ gì về đầu ra mac? bạn đang sử dụng biểu tượng được cung cấp bởi apple hay cài đặt nó thông qua macports, tự biên dịch nó, bất cứ điều gì khác? – kch

+0

hi trên linux: é => e, a => a –

Trả lời

0

tôi đoán là trên máy tính Linux của bạn miền địa phương được thiết lập khác nhau ... như xa như tôi có thể nhớ, iconv sử dụng ngôn ngữ hiện dịch UTF-X, và theo mặc định macos có locale thiết lập để "C" đó (rõ ràng) không xử lý dấu và ký tự ngôn ngữ cụ thể ... có thể cố gắng làm điều này trước khi chạy iconv:

setLocale(LC_ALL, "en_EN"); 

| K <

+0

hi cảm ơn bạn nhưng điều này dường như không phải là vấn đề như tôi đã thay đổi địa phương nhưng nó không thay đổi gì cả. Hoặc Tôi không biết làm thế nào để thực sự thay đổi vị trí tôi đang làm điều này trong .bash_profile tôi xuất khẩu LC_ALL = fr_FR.UTF-8 và chạy locale lợi nhuận: LANG = LC_COLLATE = "fr_FR.UTF- 8 "LC_CTYPE =" fr_FR.UTF-8 "LC_MESSAGES =" fr_FR.UTF-8 "LC_MONETARY =" fr_FR.UTF-8 "LC_NUMERIC =" fr_FR.UTF-8 "LC_TIME =" fr_FR.UTF-8 "LC_ALL =" fr_FR.UTF-8 " hy vọng điều này sẽ giúp tìm câu trả lời –

8

vấn đề là Mac OSX sử dụng một triển khai khác của iconv được gọi là libiconv. Hầu hết các bản phân phối Linux đều có triển khai iconv, một phần của libc. Thật không may libiconv phiên âm các ký tự như ö, è và ñ là "o,` e và ~ n. Cách duy nhất để sửa lỗi này là tải xuống nguồn và sửa đổi tệp translit.h trong thư mục lib. Tìm các dòng trông giống như thế này :

2, '"', 'o',

và thay thế bằng một cái gì đó như thế này:

1, 'o',

tôi đã mất nhiều giờ trên google cố gắng tìm ra câu trả lời cho vấn đề này và cuối cùng đã quyết định tải xuống nguồn và hack xung quanh nó. Hy vọng điều này sẽ giúp một ai đó!

0

Tôi tìm thấy cách giải quyết phù hợp với nhu cầu của mình (chỉ cần làm rõ: một tập lệnh nhận được một chuỗi và chuyển đổi nó thành URL "cố định".

workaround của tôi bao gồm trên đường ống iconv đầu ra cho một bộ lọc sed:

echo á é ç this is a test | iconv -f utf8 -t ascii//TRANSLIT | sed 's/[^a-zA-Z 0-9]//g' 

Kết quả cho trên trong OS X Yosemite là:

a e c this is a test 
0

Một lựa chọn khác là sử dụng unaccent mà được cài đặt bởi brew install unac:

$ unaccent utf-8<<<é 
e 

unaccent không chuyển đổi ký tự trong hình thức phân hủy (như LATIN SMALL LETTER E Tiếp theo COMBINING ACUTE ACCENT), nhưng bạn có thể sử dụng uconv để chuyển đổi nhân vật mẫu gồm:

$ unaccent utf-8<<<$'e\u0301' 
é 
$ uconv -f utf-8 -t utf-8 -x NFC<<<$'e\u0301'|unaccent utf-8 
e 

brew install icu4c;ln -s /usr/local/opt/icu4c/bin/uconv /usr/local/bin cài đặt uconv.

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