Bạn không nhất thiết cần UTF-8 để gặp sự cố tại đây. Miền địa phương chịu trách nhiệm thiết lập các lớp nhân vật, tức là xác định ký tự nào là dấu cách, chữ cái hoặc chữ số. Hãy xem xét hai ví dụ này:
$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep '[[:alnum:]]' || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep '[[:alnum:]]' || echo false
false
Khi cố gắng để phù hợp với mô hình nhị phân chính xác với nhau, miền địa phương không tạo sự khác biệt, tuy nhiên:
$ echo -e '\xe4' | LC_ALL=en_US.iso88591 grep "$(echo -e '\xe4')" || echo false
ä
$ echo -e '\xe4' | LC_ALL=C grep "$(echo -e '\xe4')" || echo false
ä
Tôi không chắc chắn về mức độ grep thực hiện unicode và các điểm mã khác nhau được khớp với nhau như thế nào, nhưng khớp với bất kỳ tập hợp con nào của ASCII và khớp với các ký tự đơn không có biểu diễn nhị phân thay thế sẽ hoạt động tốt bất kể miền địa phương.
Phiên bản grep nào? Có một lỗi UTF khó chịu ở đâu đó trước 2.7.1 hoặc 2.7.3. Tôi giả sử grep GNU của nó, BSD grep luôn luôn chậm. – dfc