2012-12-21 28 views
10

Trong mã C# của tôi, tôi trích xuất văn bản từ một tài liệu PDF. Khi tôi làm điều đó, tôi nhận được một chuỗi trong mã hóa UTF-8 hoặc Unicode (Tôi không chắc chắn). Khi tôi sử dụng Encoding.UTF8.GetBytes(src); để chuyển đổi nó thành một mảng byte, tôi nhận thấy rằng các khoảng trắng thực sự là hai nhân vật với các giá trị byte 194 và 160.Cách sửa mã hóa UTF cho khoảng trắng?

Ví dụ chuỗi "hành động CLE" trông giống như

[67, 76, 69, 194 ,160, 65 ,99, 116, 105, 111, 110] 

trong một mảng byte, trong đó khoảng trắng là 194 và 160 ... Và vì điều này src.IndexOf("CLE action"); đang trở lại -1 khi tôi cần nó trở lại 1.

Làm cách nào để sửa mã hóa chuỗi?

Trả lời

17

194 160 là mã hóa UTF-8 của bảng mã NO-BREAK SPACE (cùng một điểm mã HTML gọi là  ).

Vì vậy, nó thực sự không phải là một không gian, mặc dù nó trông giống như một. (Ví dụ, bạn sẽ thấy nó sẽ không bao bọc từ). Một cụm từ biểu thức chính quy cho \s sẽ khớp với nó, nhưng so sánh đơn giản với một khoảng trắng sẽ không.

Để đơn giản thay thế khoảng trống NO-BREAK bạn có thể làm như sau:

src = src.Replace('\u00A0', ' '); 
+0

Làm cách nào để thay thế một không gian không bị phá vỡ bằng một không gian thông thường? – omega

+4

@omega: src = src.Replace ('\ u00A0', ''); – RichieHindle

1

Giải thích \xC2\xA0 (= 194, 160) như UTF8 thực sự mang lại \xA0 đó là unicode non-breaking gian. Đây là một nhân vật khác với không gian thông thường và do đó, không phù hợp với không gian thông thường. Bạn phải phù hợp với không gian không phá vỡ hoặc sử dụng kết hợp mờ so với bất kỳ khoảng trống nào.

1

Trong UTF8 a0 giá trị vật c2 (194 160) được định nghĩa là NO-BREAK SPACE. Theo ISO/IEC 8859, đây là khoảng trống không cho phép chèn dòng. Thông thường, phần mềm xử lý văn bản giả định rằng ngắt dòng có thể được chèn vào bất kỳ ký tự khoảng trắng nào (đây là cách gói từ thường được thực hiện). Bạn sẽ có thể chỉ cần thay thế chuỗi ký tự của mình bằng một không gian bình thường để khắc phục sự cố.

+0

Làm cách nào để viết chức năng thay thế chuỗi? – omega

+1

@omega: src = src.Replace ('\ u00A0', ''); – RichieHindle