سؤال

لدي سلسلة يونيكود المشفرة ، ويقول ، كما UTF8.يمكن أن تحتوي سلسلة واحدة في يونيكود على تمثيلات بايت قليلة.وأتساءل ، هل هناك أي أو يمكن إنشاء أي شكل الكنسي (تطبيع) من سلسلة ونيكود-حتى نتمكن على سبيل المثال.قارن هذه السلاسل مع memcmp(3) الخ.يمكن على سبيل المثال.وحدة العناية المركزة أو أي وحدة أخرى C/C++ مكتبة تفعل ذلك?

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

المحلول

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

نصائح أخرى

مقارنة تسلسل يونيكود كوديبوينت:

أوتف-8 هو تمثيل الكنسي نفسه.سيتم دائما ترميز اثنين من سلاسل ونيكود التي تتكون من نفس كوديبوانتس ونيكود بالضبط نفس تسلسل أوتف-8 بايت ، وبالتالي يمكن مقارنة مع memcmp.بل هو خاصية ضرورية من ترميز أوتف-8 ، وإلا فإنه لن يكون فك بسهولة.ولكن يمكننا أن نذهب أبعد من ذلك ، وهذا صحيح لجميع مخططات ترميز يونيكود الرسمية ، أوتف-8 ، أوتف-16 و أوتف-32.يقومون بتشفير سلسلة إلى تسلسلات بايت مختلفة ، لكنهم دائما يشفرون نفس السلسلة إلى نفس التسلسل.إذا كنت تنظر إنديانيس واستقلال منصة ، أوتف-8 هو مخطط الترميز الموصى بها لأنك لم يكن لديك للتعامل مع أوامر بايت عند قراءة أو كتابة قيم 16 بت أو 32 بت.

لذا فإن الجواب هو أنه إذا تم ترميز سلسلتين مع نفس نظام الترميز (على سبيل المثال.أوتف-8) و إندانيس (انها ليست قضية مع أوتف-8) ، فإن تسلسل بايت الناتجة تكون هي نفسها.

مقارنة سلاسل يونيكود:

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

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

كنت تبحث لتطبيع السلسلة إلى واحدة من أشكال التطبيع يونيكود.ليبيكو يمكن القيام بذلك بالنسبة لك ، ولكن ليس على سلسلة أوتف-8.عليك أولا تحويله إلى أوشار ، وذلك باستخدام على سبيل المثال. ucnv_toUChars, ، ثم تطبيع مع unorm_normalize, ، ثم تحويل مرة أخرى باستخدام ucnv_fromUChars.أعتقد أن هناك أيضا بعض نسخة محددة من أوكنف_* لترميز أوتف-8.

إذا مممب هو هدفك الوحيد يمكنك بالطبع القيام بذلك مباشرة على مجموعة أوشار بعد unorm_normalize.

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