سؤال

لقد سمعت آراء متضاربة من الناس - وفقا ل ويكيبيديا UTF-8 صفحة.

إنهم نفس الشيء، أليس كذلك؟يمكن للشخص توضيح؟

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

المحلول

للتوسع في الإجابات التي قدمها الآخرون:

لدينا الكثير من اللغات التي تحتوي على الكثير من الأحرف التي يجب أن تعرضها أجهزة الكمبيوتر بشكل مثالي.يقوم Unicode بتعيين رقم فريد أو نقطة رمز لكل حرف.

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

ترميزات الأحرف القديمة مثل ASCII تعود إلى عصر 8 بت (ما قبل)، وتحاول حشر اللغة السائدة في الحوسبة في ذلك الوقت، أي.الإنجليزية، إلى أرقام تتراوح من 0 إلى 127 (7 بت).مع وجود 26 حرفًا في الأبجدية، سواء في شكل كبير أو غير كبير، والأرقام وعلامات الترقيم، كان ذلك يعمل بشكل جيد.تم توسيع ASCII بمقدار 8 بت للغات الأخرى غير الإنجليزية، ولكن سيتم تعيين 128 رقمًا/نقطة رمز إضافية متاحة من خلال هذا التوسيع إلى أحرف مختلفة اعتمادًا على اللغة التي يتم عرضها.تعد معايير ISO-8859 هي الأشكال الأكثر شيوعًا لهذا التعيين؛ISO-8859-1 وISO-8859-15 (المعروف أيضًا باسم ISO-Latin-1، وlatin1، ونعم، هناك إصداران مختلفان من معيار 8859 ISO أيضًا).

ولكن هذا لا يكفي عندما تريد تمثيل أحرف من أكثر من لغة واحدة، لذا فإن حشر كافة الأحرف المتوفرة في بايت واحد لن ينجح.

هناك نوعان أساسيان من الترميزات:يقوم المرء بتوسيع نطاق القيمة عن طريق إضافة المزيد من البتات.ومن أمثلة هذه الترميزات UCS2 (2 بايت = 16 بت) وUCS4 (4 بايت = 32 بت).إنهم يعانون من نفس المشكلة بطبيعتها مثل معايير ASCII وISO-8859، حيث أن نطاق قيمتها لا يزال محدودًا، حتى لو كان الحد أعلى بكثير.

يستخدم النوع الآخر من التشفير عددًا متغيرًا من البايتات لكل حرف، والتشفيرات الأكثر شيوعًا لهذا هي ترميزات UTF.تعمل جميع ترميزات UTF بنفس الطريقة تقريبًا:اخترت حجم الوحدة، وهو بالنسبة لـ UTF-8 هو 8 بت، وبالنسبة لـ UTF-16 هو 16 بت، وبالنسبة لـ UTF-32 هو 32 بت.ثم يحدد المعيار عددًا قليلاً من هذه البتات كأعلام:إذا تم تعيينها، فإن الوحدة التالية في سلسلة من الوحدات سيتم اعتبارها جزءًا من نفس الحرف.إذا لم يتم تعيينها، فإن هذه الوحدة تمثل حرفًا واحدًا بالكامل.وبالتالي، فإن الأحرف (الإنجليزية) الأكثر شيوعًا تشغل بايتًا واحدًا فقط في UTF-8 (اثنان في UTF-16، و4 في UTF-32)، ولكن يمكن أن تشغل أحرف اللغة الأخرى ستة بايت أو أكثر.

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

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

يتعامل Windows مع ما يسمى بسلاسل "Unicode" كسلاسل UTF-16، في حين أن معظم أنظمة UNIXes تستخدم UTF-8 افتراضيًا هذه الأيام.تميل بروتوكولات الاتصالات مثل HTTP إلى العمل بشكل أفضل مع UTF-8، حيث أن حجم الوحدة في UTF-8 هو نفسه الموجود في ASCII، وقد تم تصميم معظم هذه البروتوكولات في عصر ASCII.من ناحية أخرى، UTF-16 يعطي الأفضل متوسط أداء الفضاء/المعالجة عند تمثيل جميع اللغات الحية.

يحدد معيار Unicode نقاط ترميز أقل مما يمكن تمثيله في 32 بت.وبالتالي، ولجميع الأغراض العملية، أصبح UTF-32 وUCS4 هما نفس التشفير، حيث من غير المحتمل أن تضطر إلى التعامل مع أحرف متعددة الوحدات في UTF-32.

نأمل أن يملأ بعض التفاصيل.

نصائح أخرى

لسوء الحظ، يتم استخدام "Unicode" بعدة طرق مختلفة، اعتمادًا على السياق.الاستخدام الصحيح له (IMO) هو مجموعة أحرف مشفرة - أي.مجموعة من الأحرف وتعيين بين الأحرف وعدد صحيح نقاط الكود يمثلهم.

ترميز UTF-8 هو ترميز أحرف - طريقة للتحويل من تسلسل البايتات إلى تسلسل الأحرف والعكس.وهو يغطي كامل مجموعة أحرف Unicode.يتم ترميز ASCII كبايت واحد لكل حرف، وتأخذ الأحرف الأخرى المزيد من البايتات اعتمادًا على نقطة الرمز المحددة الخاصة بها (ما يصل إلى 4 بايت لجميع نقاط الكود المحددة حاليًا، أي.ما يصل إلى U-0010FFFF، وبالفعل يمكن لـ 4 بايت التعامل مع ما يصل إلى U-001FFFFF).

عند استخدام "Unicode" كاسم لترميز الأحرف (على سبيل المثال.مثل .NET التشفير.Unicode الملكية) يعني عادة UTF-16, ، الذي يقوم بترميز الأحرف الأكثر شيوعًا على شكل بايتين.تستخدم بعض الأنظمة الأساسية (لا سيما .NET وJava) UTF-16 كتشفر الأحرف "الأصلي".يؤدي هذا إلى مشاكل كبيرة إذا كنت بحاجة إلى القلق بشأن الأحرف التي لا يمكن ترميزها بقيمة UTF-16 واحدة (يتم ترميزها على أنها "أزواج بديلة") - لكن معظم المطورين لا يقلقون أبدًا بشأن هذا الأمر، IME.

بعض المراجع على Unicode:

واسمحوا لي أن أستخدم مثال لتوضيح هذا الموضوع:

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

لا شيء سحري حتى الآن، هو بسيط جدا. الآن، دعونا نقول اننا ترغب في تخزين هذه الشخصية على القرص الثابت لدينا. للقيام بذلك، ونحن بحاجة لتخزين حرف في تنسيق ثنائي. يمكننا ببساطة تخزينه كما هو '01101100 01001001. القيام به!

ولكن انتظر لحظة، و'01101100 01001001' حرف واحد أو حرفين؟ كنت أعرف هذا هو حرف واحد لقلت لك، ولكن عندما يقرأ الكمبيوتر، فإنه لا يوجد لديه فكرة. لذلك نحن بحاجة إلى نوع من "ترميز" لنقول للكمبيوتر للتعامل معه واحد.

وهذا هو المكان الذي قواعد "UTF-8" يأتي في: HTTP: / /www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

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

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

والكتابة من النتيجة في سطر واحد:

11100110 10110001 10001001

وهذه هي القيمة UTF-8 (ثنائية) من الأحرف الصينية! (تأكد من ذلك بنفسك: http://www.fileformat.info/info /unicode/char/6c49/index.htm )

موجز

A chinese character:      汉
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

وP.S. إذا كنت تريد أن تتعلم هذا الموضوع في بيثون، انقر هنا

وانهم ليسوا نفس الشيء - UTF-8 هو وسيلة معينة من ترميز يونيكود

وهناك الكثير من ترميزات مختلفة يمكنك الاختيار من بينها اعتمادا على التطبيق الخاص بك والبيانات التي تنوي استخدامها. والأكثر شيوعا هي UTF-8، UTF-16 و UTF-32 ق بقدر ما أعرف.

ويونيكود فقط تعريف <م> نقطة كود ، وهذا هو، وهو عدد يمثل حرف. كيفية تخزين هذه النقاط التعليمات البرمجية في الذاكرة يعتمد على ترميز الذي تستخدمه. UTF-8 هو أحد السبل لترميز أحرف Unicode، ضمن أشياء أخرى كثيرة.

يونيكود هو معيار يحدد، جنبًا إلى جنب مع ISO/IEC 10646، مجموعة الأحرف العالمية (UCS) وهي عبارة عن مجموعة شاملة من جميع الأحرف الموجودة المطلوبة لتمثيل جميع اللغات المعروفة تقريبًا.

يقوم Unicode بتعيين اسم ورقم (رمز الحرف, ، أو نقطة الكود) لكل شخصية في ذخيرتها.

ترميز UTF-8, ، هي طريقة لتمثيل هذه الأحرف رقميًا في ذاكرة الكمبيوتر.يقوم UTF-8 بتعيين كل نقطة رمز في سلسلة من الثمانيات (8 بايت بايت)

على سبيل المثال،

حرف UCS = شخصية يونيكود هان

نقطة كود UCS = U+24B62

ترميز UTF-8 = F0 A4 AD A2 (ست عشري) = 11110000 10100100 10101101 10100010 (bin)

يونيكود هو مجرد المعيار الذي يحدد مجموعة أحرف (<أ href = على "HTTP: //en.wikipedia.org/wiki/Universal_Character_Set "يختلط =" noreferrer "> UCS ) وترميزات (<لأ href =" http://en.wikipedia.org/wiki/Unicode_Transformation_Format "يختلط =" noreferrer "> UTF ) لتشفير هذه مجموعة الأحرف. ولكن بصفة عامة، ويشار Unicode إلى مجموعة الأحرف وليس المعيار.

المطلق الدنيا كل مطور برامج على الاطلاق، إيجابيا يجب أن تعرفه عن يونيكود ومجموعات الأحرف (لا أعذار !) و يونيكود في 5 دقائق .

تشرح الإجابات الموجودة بالفعل الكثير من التفاصيل، ولكن إليك إجابة قصيرة جدًا مع الشرح والمثال الأكثر مباشرة.

يونيكود هو معيار يقوم بتعيين الأحرف إلى نقاط التعليمات البرمجية.
كل حرف لديه نقطة تشفير فريدة (رقم التعريف)، وهو رقم مثل 9731.

UTF-8 هو ال التشفير من نقاط الكود.
من أجل تخزين كافة الأحرف على القرص (في ملف)، يقوم UTF-8 بتقسيم الأحرف إلى ما يصل إلى 4 ثمانيات (تسلسلات 8 بت) - بايت.UTF-8 هو أحد الترميزات المتعددة (طرق تمثيل البيانات).على سبيل المثال، في Unicode، تمثل نقطة الترميز (العشرية) 9731 رجل ثلج () ، والذي يتكون من 3 بايت في UTF-8: E2 98 83

وهنا أ قائمة مرتبة مع بعض الأمثلة العشوائية.

1.يونيكود

هناك الكثير من الشخصيات حول العالم، مثل "$,&,h,a,t,?,张,1,=,+...".

ثم تأتي منظمة مخصصة لهذه الشخصيات،

لقد صنعوا معيارًا يسمى "Unicode".

المعيار هو كما يلي:

  • قم بإنشاء نموذج يُسمى فيه كل موضع "نقطة الكود" أو "موضع الكود".
  • المواضع كلها من U+0000 إلى U+10FFFF؛
  • حتى الآن، بعض المواضع مليئة بالأحرف، ومواضع أخرى محفوظة أو فارغة.
  • على سبيل المثال، يتم ملء الموضع "U+0024" بالحرف "$".

ملاحظة: بالطبع هناك منظمة أخرى تسمى ISO تحافظ على معيار آخر - "ISO 10646"، وهو نفس المعيار تقريبًا.

2.ترميز UTF-8

كما هو مذكور أعلاه، U+0024 هو مجرد موضع، لذلك لا يمكننا حفظ "U+0024" في الكمبيوتر للحرف "$".

يجب أن يكون هناك طريقة الترميز.

ثم تأتي طرق التشفير، مثل UTF-8، UTF-16، UTF-32، UCS-2....

ضمن UTF-8، يتم ترميز نقطة الرمز "U+0024" إلى 00100100.

00100100 هي القيمة التي نحفظها في الكمبيوتر لـ "$".

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

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

في الواقع، يونيكود لديه طريقة مختلفة في التفكير في الشخصيات، وعليك أن تفهم الطريقة يونيكود من التفكير في الأشياء أو شيئا لن يكون له معنى.

وحتى الآن، لقد افترض أن إلكتروني خرائط لبعض البتات التي يمكن تخزينها على القرص أو في الذاكرة:

وA -> 0100 0001

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

و"... يتم تعيين كل حرف أفلاطوني في كل الأبجدية الرقم السحري من قبل اتحاد يونيكود الذي هو مكتوب مثل هذا: U + 0639 ويسمى هذا الرقم السحري لنقطة رمز وU + يعني." يونيكود "وأرقام هي ست عشرية. U + 0639 هو الحرف العربي في مدينة العين. وقال إن اللغة الإنجليزية الحرف A يكون U + 0041 .... "

و"... حسنا، لذلك نقول لدينا سلسلة:

مرحبا

والتي، في Unicode، يتوافق مع هذه النقاط كود خمسة:

وU + 0048 U + 0065 U + 006C U + 006C U + 006F.

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

و"... وهنا تأتي ترميزات في.

وأقدم فكرة عن ترميز Unicode، مما أدى إلى أسطورة عن وحدتي بايت، وكان، مهلا، دعونا فقط تخزين هذه الأرقام في وحدتي بايت لكل منهما. لذلك مرحبا يصبح

و00 48 00 65 00 6C 00 6C 00 6F

وعلى حق؟ ليس بهذه السرعة! يمكن أن يكون ذلك أيضا:

48 00 65 00 6C 00 6C 00 6F 00؟ ... "

يونيكود هو معيار واسع النطاق يحدد أكثر من 130.000 حرفًا ويخصص لكل منها رمزًا رقميًا ("نقطة ترميز").كما أنه يحدد قواعد لكيفية فرز هذا النص وتطبيعه وتغيير حالته والمزيد.يتم تمثيل الحرف في Unicode بنقطة رمز من صفر إلى 0x10FFFF ضمنًا، على الرغم من أن بعض نقاط الرمز محجوزة ولا يمكن استخدامها للأحرف.

يمكن تمثيل الرموز الموجودة في Unicode بأكثر من تشفير.أبسطها هو UTF-32، والذي يقوم ببساطة بتشفير نقطة الرمز كأعداد صحيحة 32 بت، ويبلغ عرض كل منها 4 بايت.

ترميز UTF-8 هو ترميز آخر، وسرعان ما أصبح المعيار الفعلي.يتم ترميزه كسلسلة من قيم البايت.يمكن لكل نقطة رمز استخدام عدد متغير من هذه البايتات.يتم تشفير نقاط التعليمات البرمجية في نطاق ASCII فقط، لتكون متوافقة مع ASCII.تستخدم نقاط التعليمات البرمجية الموجودة خارج هذا النطاق عددًا متغيرًا من البايتات، إما 2 أو 3 أو 4، اعتمادًا على النطاق الموجود فيه.

تم تصميم UTF-8 مع أخذ هذه الخصائص في الاعتبار:

  • يتم ترميز أحرف ASCII تمامًا كما هي في ASCII، بحيث تكون سلسلة ASCII صالحة أيضًا كـ UTF-8.

  • الفرز الثنائي:سيؤدي فرز سلاسل UTF-8 باستخدام الفرز الثنائي الساذج إلى فرز جميع نقاط التعليمات البرمجية بترتيب رقمي.

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

  • يمكن التحقق من صحة UTF-8 بسهولة، وتمييزه عن ترميزات الأحرف الأخرى بواسطة أداة التحقق.نادرًا ما يتم التحقق من صحة النص في ترميزات 8 بت أو متعددة البايت الأخرى باعتباره UTF-8.

  • دخول عشوائي:في أي نقطة في سلسلة UTF-8، من الممكن معرفة ما إذا كان البايت في هذا الموضع هو البايت الأول من الحرف أم لا، والرجوع إلى بداية هذا الحرف، دون الحاجة إلى الإشارة إلى أي شيء في بداية السلسلة.

إنهم نفس الشيء، أليس كذلك؟

لا، ليسوا كذلك.


أعتقد أن الجملة الأولى من صفحة ويكيبيديا الذي أشرت إليه يعطي ملخصًا موجزًا ​​لطيفًا:

UTF-8 عبارة عن ترميز أحرف متغير العرض قادر على تشفير جميع نقاط التعليمات البرمجية الصالحة البالغ عددها 1,112,064 في Unicode باستخدام بايت واحد إلى أربعة بايت 8 بت.

للتوضيح:

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

    ! -> U+0021 (21),  
    " -> U+0022 (22),  
    \# -> U+0023 (23)
    
  • يعد UTF-8 إحدى الطرق لتشفير نقاط الكود هذه شكل يمكن للكمبيوتر أن يفهمه، ويعرف أيضًا باسم أجزاء.بمعنى آخر، إنها طريقة/خوارزمية لتحويل كل نقطة من نقاط الرمز هذه إلى تسلسل من البتات أو تحويل تسلسل من البتات إلى نقاط رمز مكافئة.لاحظ أن هناك الكثير من الترميزات البديلة لـ Unicode.


يقدم جويل شرحًا رائعًا ونظرة عامة على التاريخ هنا.

ترميز UTF-8 هي طريقة لترميز أحرف Unicode باستخدام تسلسلات 8 بت.

يونيكود هو معيار لتمثيل مجموعة كبيرة ومتنوعة من الشخصيات من العديد من اللغات.

إذا جاز لي أن ألخص ما جمعته من هذا الموضوع:

يونيكود "يترجم" الأحرف إلى أرقام ترتيبية (في شكل عشري).

à = 224

UTF-8 هو ترميز "يترجم" هذه الأرقام إلى ثنائي التوكيلات.

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