2013-01-24 40 views
5

Tôi đang sử dụng một StringBuilder trong C# để nối thêm một số văn bản, có thể là tiếng Anh (trái sang phải) hoặc tiếng Ả Rập (phải sang trái)phải sang trái Ngôn ngữ Bracket Đảo ngược

stringBuilder.Append("("); 
stringBuilder.Append(text); 
stringBuilder.Append(") "); 
stringBuilder.Append(text); 

Nếu text = "A" thì ra là "(A)"

Nhưng nếu text = "بتث", sau đó đầu ra là "(بتث) بتث"

Bất kỳ ý tưởng?

+2

99,999% không phải là lỗi mã mà là bất kỳ đầu ra nào bạn chọn. Bạn thấy đầu ra này ở đâu? Đó là phức tạp khủng khiếp cho giao diện người dùng để hỗ trợ cả hai hướng, cho đến ngày nay thậm chí gmail có vấn đề lớn với nó. –

Trả lời

7

Đây là lỗ hổng nổi tiếng trong công cụ hiển thị văn bản của Windows khi được yêu cầu hiển thị văn bản từ phải sang trái, tiếng Ả Rập hoặc tiếng Do Thái. Nó có một vấn đề khó giải quyết, mọi người thường quay trở lại với các từ và dấu câu của phương Tây khi không có từ thay thế tốt nào có sẵn trong ngôn ngữ. Tên thương hiệu và tên công ty chẳng hạn. Trình kết xuất cố gắng đoán đúng thứ tự hiển thị bằng cách xem xét các điểm mã, với các ký tự trong bộ ký tự La tinh rõ ràng phải được hiển thị từ trái sang phải.

Nhưng nó lộn xộn tại dấu chấm câu, với dấu ngoặc đơn hiển thị nhiều nhất. Bạn phải rõ ràng về nó vì vậy nó biết phải làm gì, bạn phải sử dụng đánh dấu Unicode từ phải sang trái, U+200F hoặc \u200f trong mã C#. Ngược lại, sử dụng dấu từ trái sang phải nếu bạn biết mình cần hiển thị LTR, U+200E.

+0

Đặt từ phải sang trái sau khi đóng sẽ giải quyết vấn đề đầu ra cụ thể này, nhưng nếu có thể, bạn phải áp dụng đúng giá trị hướng cho điều khiển của mình. –

+0

Tôi đã thử nó và nó hoạt động. Cảm ơn bạn! – daniely

0

Sử dụng AppendFormat thay vì chỉ Append:

stringBuilder.AppendFormat("({0}) {0}", text) 

này có thể khắc phục vấn đề, nhưng nó có thể - bạn cần phải nhìn vào giá trị text - nó có lẽ đã LTR/RTL đánh dấu ký tự nhúng. Những điều này cần phải được loại bỏ hoặc sửa chữa trong giá trị.

+0

Phần sau của câu trả lời của bạn là đúng về (các dấu LTR/RTL), đó là nếu 'AppendFormat' về cơ bản là' Append (string.Format ("{0}", text)) '(tôi đã thử nghiệm' Append (string). Định dạng ("")) ') – LukeHennerley

+0

@ LukeHennerley - Về bản chất là - chỉ thuận tiện hơn nhiều phần phụ khi OP đang làm. – Oded

0

Tôi gặp sự cố tương tự và tôi đã giải quyết được vấn đề bằng cách tạo một hàm kiểm tra từng Char trong Unicode. Nếu nó là từ trang FE sau đó tôi thêm 202C sau khi nó như hình dưới đây. Nếu không có nó thì RTL và LTF được trộn lẫn với những gì tôi muốn.

string us = string.Format("\uFE9E\u202C\uFE98\u202C\uFEB8\u202C\uFEC6\u202C\uFEEB\u202C\u0020\u0660\u0662\u0664\u0668 Aa1"); 
Các vấn đề liên quan