سؤال

أنا أعمل على تطبيق في دلفي 2009 الذي يجعل الاستخدام المكثف RTF, تحريرها باستخدام TRichEdit و TLMDRichEdit.المستخدمين الذين دخلوا النص الياباني في هذه RTF ضوابط تم تقديم متقطعة تقارير عن النص الياباني عرض رطانة عند إعادة تحميل المحتوى ، سواء على Win XP و Vista مع الشرقية دعم اللغة المثبتة.

عادة, الإنجليزية و اليابانية مختلطة و هو في الغالب عرضها دون مشكلة ، على سبيل المثال:

Inventory turns partnerships.  在庫回転率の

(أعتذر إذا كان النص الياباني هو كسر غير صحيح - أنا لا أتكلم أو قراءة اللغة).

كثيرا جدا ولكن اليابانيين فقط جزء من النص سوف تكون رطانة ، على سبيل المثال:

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

من مستفيضة البحث على الإنترنت ، يبدو أن المشكلة هي نتيجة الخطوط حفظها كجزء من RTF.الخطوط موجودة في اللغة اليابانية نسخة من ويندوز هو ليس بالضرورة نفس لنا النسخة الإنجليزية.فمن الممكن أن برمجيا استبدال الخطوط في ملف RTF التي ينتج تقريبا نتيجة مقبولة ، أي

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

ومع ذلك, لا يزال هناك عدد غير قليل من "خردة" الشخصيات في هناك والتي لا بشكل صحيح كما اعترف الأحرف اليابانية.تبحث في الخام RTF سترى التالي:

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

ومن الواضح أن أحرف Unicode يتم تقديمها بشكل صحيح, ولكن على سبيل المثال \'82\'82 زوج من الشخصيات يجب أن يكون شيئا آخر ؟ تخميني هو أنه يمثل في الواقع مزدوجة البايت من نوع ما ، والتي كان لسبب غامض ترميز حرفين منفصلة بدلا من واحد حرف Unicode.

هل هناك عام (نسبيا) طريقة مضمونة اتخاذ RTF التي تحتوي على اللغات الشرقية و موثوق عرض عليه مرة أخرى ؟

لأجل اكتمال حدثت RTF الخط الجدول بالطريقة التالية:

  • استبدال اسم الخط "?l ؟ "ص" ؟ o ؟ S ؟ الخامس ؟ b ؟ ن ؛ " مع "\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;"
  • تحديث أسماء الخط عن طريق استبدال "\فرومان\fprq1\fcharset0 " مع "\fnil\fprq1\fcharset128 "
  • تحديث أسماء الخط عن طريق استبدال "\فرومان\fprq1\fcharset238 " مع "\fnil\fprq1\fcharset128 "
  • تحديث أسماء الخط عن طريق استبدال "\فرومان\fprq1 " مع "\fnil\fprq1\fcharset128 "
  • استبدال اسم الخط "???????;" مع "\'82\'6c\'82\'72 \'82\'6f\'83\'53\'83\'56\'83\'62\'83\'4e;"

تحديث:تحديث الخط الأسماء وحدها لن تحدث فرقا.الإعدادات المحلية يبدو أن المشكلة الكبيرة.لقد رأيت بضعة الموقع مناقشة حول طرق تحويل عرض اليابانية RTF إلى شيء أكثر القارئ أن التعامل معها ، ولكن لم أجد الحل حتى الآن ، انظر على سبيل المثال:هنا و هنا.

هل كانت مفيدة؟

المحلول

تخميني هو أن تغيير أسماء الخط في RTF ربما جعلت الأمور أسوأ.إذا كان الخط المحدد في RTF ليست Unicode الخط ، ثم بالتأكيد الشخصيات المقرر أن يصدر في هذا الخط سوف يكون ترميز التحول-JIS, ليست Unicode.وبعد ذلك سوف الشخصيات الأخرى في النص.حتى تتعامل مع الأمر كما Unicode ، أو إلحاق نص Unicode ، سوف يسبب الفساد كما ترى.تحتاج إلى تحديد ما إذا كان RTF استيراد يتم ترميز التحول-JIS أو يونيكود ، وأيضا ما إذا كان الجهاز الذي تعمل على (وبالتالي D2009 شكل الإدخال الافتراضية) اليابانية أو لا.في اليابان إذا كان ملف نصي قد لا Unicode بوم عادة سيكون التحول-JIS (ولكن ليس دائما).

نصائح أخرى

كنت أرى شيئا من هذا القبيل ، ولكن ليس مع الخطوط اليابانية.فقط أحرف خاصة مثل الصغير (كما في ميكرولتر) و حروف الفوقية.المشكلة أنه على الرغم من RTF سلسلة كنت ترسل إلى المستخدم من ASP.NET صفحة ويب الصحيح (كنت أرى المشفرة RTF تيار باستخدام Fiddler2) ، عندما MS Word فعلا فتحت RTF, وأضاف حفنة من القمامة الهروب رموز مثل ما أرى في النموذج الخاص بك.

ما قمت به هو تشغيل كامل نص RTF خلال تحويل الروتينية التي تبادلت جميع الشخصيات على ascii 127 الخاصة unicode نقطة أي ما يعادل.لذلك أود أن تحصل على شيء مثل \uc1\u181?(مايكرو) على أحرف خاصة.عندما فعلت ذلك ، كلمة كان قادرا على فتح الملف لا مشكلة.ومن المفارقات أن إعادة ترميز \uc1\uxxx?العودة إلى RTF هرب حكمه.

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

لست متأكدا إذا كان هذا سوف يساعد الخاص بك المشكلة, لكنه يعمل بالنسبة لي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top