2009-05-01 44 views
5

Tôi đang làm việc trên một ứng dụng trong Delphi 2009, sử dụng nhiều RTF, được chỉnh sửa bằng TRichEdit và TLMDRichEdit. Người dùng nhập văn bản tiếng Nhật trong các điều khiển RTF này đã gửi các báo cáo liên tục về văn bản tiếng Nhật được hiển thị dưới dạng vô nghĩa khi tải lại nội dung, cả trên Win XP và Vista, với cài đặt Hỗ trợ Ngôn ngữ Đông.Cách hiển thị chính xác Phông chữ RTF Nhật Bản

Thông thường, tiếng Anh và tiếng Nhật là hỗn hợp và chủ yếu được hiển thị mà không có một vấn đề, ví dụ:

Inventory turns partnerships. 在庫回転率の 

(lời xin lỗi của tôi nếu văn bản tiếng Nhật được chia không chính xác - tôi không nói hoặc đọc các ngôn ngữ).

Khá thường xuyên tuy nhiên, chỉ có phần tiếng Nhật của văn bản sẽ vô nghia, ví dụ:

ŒÉñ?“]-¦Œüã‚Ì·•Ê‰?-vˆö‚ðŽû‰v‚ÉŒø‰?“I‚ÉŒ‹‚т‚¯‚é’mŽ¯‚ª‘÷Ý‚·‚é?(マーケットセクター、 
見込み客の優 先順位と彼らに販売する知識) 

Từ tìm kiếm trực tuyến rộng lớn, có vẻ như vấn đề là do hậu quả của các phông chữ lưu lại dưới dạng một phần của RTF. Phông chữ hiện diện trên phiên bản tiếng Nhật của Windows không nhất thiết phải giống như phiên bản tiếng Anh của Hoa Kỳ. Có thể lập trình thay thế các font trong file RTF trong đó sản lượng một kết quả gần như chấp nhận được, ví dụ:

-D‚‚スƒIƒyƒŒ[ƒVƒ・“‚ニƒƒWƒXƒeƒBƒbƒN‚フƒpƒtƒH[ƒ}ƒ“ƒX‚-˜‰v‚ノŒ‹‚ム‚ツ‚ッ‚ネ‚「‚±ニ‚ヘ?A‘‚「‚ノ-ウ‘ハ‚ナ‚ ‚驕B‚サ‚‚ヘAl“セ‚オ‚ス・‘P‚フˆロ‚ƒƒXƒN‚ノ‚ウ‚‚キB 

Tuy nhiên, vẫn còn khá nhiều "rác" nhân vật trong đó mà không được công nhận một cách chính xác như nhân vật Nhật Bản. Nhìn vào RTF thô bạn sẽ thấy như sau:

-D\'82\'82\u65405?\'83I\'83y\'83\'8c[\'83V\'83\u12539?\ldblquote\'82\u65414? 

Rõ ràng, các ký tự Unicode được hiển thị chính xác, nhưng ví dụ: cặp nhân vật \ '82 \ '82 phải là cái gì khác? Tôi đoán là nó thực sự đại diện cho một nhân vật đôi byte của một số loại, đó là vì một số lý do bí ẩn được mã hóa như hai nhân vật riêng biệt chứ không phải là một ký tự Unicode duy nhất.

Có cách nào chung chung, (tương đối) dễ hiểu để có RTF có chứa ngôn ngữ phương Đông và hiển thị lại một lần nữa không?

Đối với đầy đủ sake, tôi cập nhật bảng chữ RTF theo cách sau:

  • thay thế tên font "l r o S V b N;??????" với "\ '82 \ '6c \ '82 \ '72 \ '82 \' 6f \ '83 \ '53 \ '83 \ '56 \ '83 \ '62 \ '83 \ '4e;"
  • Cập nhật tên phông chữ bằng cách thay thế "\ froman \ fprq1 \ fcharset0" với "\ fnil \ fprq1 \ fcharset128"
  • Cập nhật tên phông chữ bằng cách thay thế "\ froman \ fprq1 \ fcharset238" với "\ fnil \ fprq1 \ fcharset128"
  • Cập nhật tên phông chữ bằng cách thay thế "\ froman \ fprq1" bằng "\ fnil \ fprq1 \ fcharset128"
  • Thay thế tên phông chữ "?? ?????;" với "\ '82 \ '6c \ '82 \ '72 \ '82 \' 6f \ '83 \ '53 \ '83 \ '56 \ '83 \ '62 \ '83 \ '4e;"

Cập nhật: Cập nhật tên phông chữ một mình sẽ không tạo sự khác biệt. Ngôn ngữ có vẻ là vấn đề lớn. Tôi đã thấy một vài trang thảo luận về cách chuyển đổi hiển thị RTF Nhật Bản thành một thứ mà hầu hết người đọc sẽ xử lý, nhưng tôi chưa tìm được giải pháp, xem ví dụ: herehere.

+0

Nếu có nhiều hơn một thư viện RTF, các bản dịch khác nhau từ/đến RTF là một lý do tiềm năng. Nếu người viết RTF phát ra mã mà người đọc không hiểu, mọi thứ đều có thể. – mjn

+0

Tên phông chữ \ '82l \' 82r \ '82o \' 83S \ '83V \' 83b \ '83N được hiển thị dưới dạng' MS PGothic'' khi mở bằng Wordpad trên Windows 10. Khi được mở bằng LibreOffice hoặc bằng Wordpad Win 7, nó được hiển thị là ''MS P ゴ シ ッ ク''. – mjn

+0

Lưu ý rằng tên phông chữ? L? R? O? S? V? B? N; trong câu hỏi của bạn dường như đã bị hỏng, tôi đoán rằng đó là \ '82l \' 82r \ '82o \' 83S \ '83V \' 83b \ '83N ở trạng thái trước của tài liệu. – mjn

Trả lời

1

Tôi đoán là việc thay đổi tên phông chữ trong RTF có thể làm mọi thứ tồi tệ hơn. Nếu phông chữ được chỉ định trong RTF không phải là phông chữ Unicode, thì chắc chắn các ký tự do được hiển thị trong phông chữ đó sẽ được mã hóa dưới dạng Shift-JIS, không phải là Unicode. Và sau đó các ký tự khác trong văn bản cũng vậy. Vì vậy, điều trị toàn bộ điều như Unicode, hoặc thêm văn bản Unicode, sẽ gây ra tham nhũng bạn nhìn thấy. Bạn cần thiết lập xem RTF bạn nhập có được mã hóa Shift-JIS hay Unicode hay không và liệu máy bạn đang chạy trên (và do đó định dạng đầu vào mặc định D2009) có phải là tiếng Nhật hay không. Ở Nhật Bản, nếu một tập tin văn bản không có Unicode BOM, nó thường sẽ là Shift-JIS (nhưng không phải lúc nào).

+1

Điều tra thêm đã cho thấy rằng việc thay đổi phông chữ không phải là một ý tưởng hay. Cụ thể, việc thay đổi bộ ký tự được chỉ định là không có, vì \ fcharset0 là ANSI và \ fcharset128 là Shift-JIS. Trên bề mặt ít nhất, có vẻ như trao đổi giữa các phông chữ khác nhau với các bộ ký tự khác nhau sẽ cho phép bạn mã hóa chính xác những gì người dùng đã nhập. Thật không may, nó vẫn không hoàn toàn giải thích tại sao điều khiển RTF không thể tìm ra màn hình chính xác. – Ryan

1

Tôi đã nhìn thấy một cái gì đó tương tự, nhưng không phải với phông chữ tiếng Nhật. Chỉ các ký tự đặc biệt như micro (như microliters) và siêu chữ. Vấn đề là mặc dù chuỗi RTF tôi gửi cho người dùng từ một trang web ASP.NET là chính xác (tôi có thể thấy dòng RTF được mã hóa bằng Fiddler2), khi MS Word thực sự mở RTF, nó đã thêm vào một loạt thoát rác mã như những gì tôi thấy trong mẫu của bạn.

Điều tôi đã làm là chạy toàn bộ văn bản RTF thông qua một quy trình chuyển đổi hoán đổi tất cả các ký tự trên ascii 127 thành điểm unicode đặc biệt tương đương. Vì vậy, tôi sẽ nhận được một cái gì đó như \ uc1 \ u181? (vi) cho các ký tự đặc biệt. Khi tôi đã làm điều đó, Word đã có thể mở tập tin không có vấn đề. Trớ trêu thay, nó đã mã hóa lại \ uc1 \ uxxx? trở lại tương đương thoát RTF của họ.

Private Function ConvertRtfToUnicode(ByVal value As String) As String 

    Dim ch As Char() = value.ToCharArray() 
    Dim c As Char 
    Dim sb As New System.Text.StringBuilder() 
    Dim code As Integer 

    For i As Integer = 0 To ch.Length - 1 
     c = ch(i) 
     code = Microsoft.VisualBasic.AscW(c) 
     If code <= 127 Then 
      'Don't need to replace if one of your typical ASCII codes 
      sb.Append(c) 
     Else 
      'MR: Basic idea came from here http://www.eggheadcafe.com/conversation.aspx?messageid=33935981&threadid=33935972 
      ' swaps the character for it's Unicode decimal code point equivalent 
      sb.Append(String.Format("\uc1\u{0:d}?", code)) 
     End If 
    Next 

    Return sb.ToString() 

End Function 

Không chắc chắn điều đó có giúp ích cho bạn hay không, nhưng nó có hiệu quả với tôi.

+0

Cảm ơn bạn đã nhập mã mẫu! Tôi đã thử một cái gì đó tương tự như ban đầu, nhưng nó không có sự khác biệt như dòng nhân vật RTF chính nó không chứa bất kỳ Unicode. Tuy nhiên, đây vẫn là một chức năng vô cùng hữu ích để giữ lại. – Ryan

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