الفرق بين المراجعتين لصفحة: «Ruby/Encoding»

من موسوعة حسوب
إضافة جميع معلومات الصفحة
 
طلا ملخص تعديل
 
(9 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
== الصنف Encoding في روبي ==
{{DISPLAYTITLE:الصنف <code>Encoding</code> في روبي}}
يمثل الصنف Encoding ترميز المحارف الذي يمكننا استخدامه في لغة روبي. تُعرَّف النّسخة المنشأة من الصنف Encoding بأنّها ثابتٌ (constant) يندرج ضمن مجال أسماء الصنف (encoding namespace)؛ يكون لها اسم، واسم بديل (Alias) اختياري.
يمثل الصنف <code>Encoding</code> ترميز المحارف الذي يمكننا استخدامه في لغة روبي. تُعرَّف النّسخة المنشأة من الصنف <code>Encoding</code> بأنّها ثابتٌ (constant) يندرج ضمن مجال أسماء الصنف (encoding namespace)؛ يكون لها اسم، واسم بديل (Alias) اختياري.<syntaxhighlight lang="ruby">
 
Encoding::ISO_8859_1.name
Encoding::ISO_8859_1.name
 
#=> "ISO-8859-1"
<nowiki>#</nowiki>=> "ISO-8859-1"


Encoding::ISO_8859_1.names
Encoding::ISO_8859_1.names
 
#=> ["ISO-8859-1", "ISO8859-1"]
<nowiki>#</nowiki>=> ["ISO-8859-1", "ISO8859-1"]
</syntaxhighlight>التّوابع (methods) في لغة روبي التي تتعامل مع التّرميزات تعيد أو تقبل النسخ <code>Encoding</code> على شكل وسيط (عندما يقبل التّابع كائنًا على شكل وسيط، يمكن عندها أن نستخدم اسم أو لقب الترميز عوضًا عن الكائن).<syntaxhighlight lang="ruby">
 
التّوابع (methods) في لغة روبي التي تتعامل مع التّرميزات تعيد أو تقبل النسخ Encoding على شكل وسيط (عندما يقبل التّابع كائنًا على شكل وسيط، يمكن عندها أن نستخدم اسم أو لقب الترميز عوضًا عن الكائن).
 
"some string".encoding
"some string".encoding
 
#=> #<Encoding:UTF-8>
<nowiki>#</nowiki>=> #<Encoding:UTF-8>


string = "some string".encode(Encoding::ISO_8859_1)
string = "some string".encode(Encoding::ISO_8859_1)
 
#=> "some string"
<nowiki>#</nowiki>=> "some string"
 
string.encoding
string.encoding
 
#=> #<Encoding:ISO-8859-1>
<nowiki>#</nowiki>=> #<Encoding:ISO-8859-1>


"some string".encode "ISO-8859-1"
"some string".encode "ISO-8859-1"
#=> "some string"


<nowiki>#</nowiki>=> "some string"
</syntaxhighlight>الترميز <code>Encoding::ASCII_8BIT</code> هو ترميز خاص يستخدم عادةً مع السلاسل النصية التي بحجم بايت (byte string)، وليس مع السلاسل النصية المحرفية (character string)، ولكن كما يوحي الاسم، فإن رموزه التي تقع ضمن مجال الجدول <code>ASCII</code> تعدُّ على أنها محارف <code>ASCII</code>. هذا مفيد عندما تستخدم محارف ذات ترميز <code>ASCII-8BIT</code> مع محارف أخرى ذات ترميز <code>ASCII</code>.
 
الترميز Encoding::ASCII_8BIT هو ترميز خاص يستخدم عادةً مع السلاسل النصية التي بحجم بايت (byte string)، وليس مع السلاسل النصية المحرفية (character string)، ولكن كما يوحي الاسم، فإن رموزه التي تقع ضمن مجال الجدول ASCII تعدُّ على أنها محارف ASCII. هذا مفيد عندما تستخدم محارف ذات ترميز ASCII-8BIT مع محارف أخرى ذات ترميز ASCII.


== تغيير الترميز (Changing an encoding) ==
== تغيير الترميز (Changing an encoding) ==
يمكن تغيير التّرميز الخاص بسلسلة نصّية (string) من خلال طريقتين مختلفتين:
يمكن تغيير التّرميز الخاص بسلسلة نصّية (string) من خلال طريقتين مختلفتين:
 
* أولاً، من الممكن ضبط ترميز سلسلة نصّية إلى ترميز جديد من دون تغيير تمثيل البايت الداخلي للسّلسلة النصّية، وذلك من خلال <code>[[Ruby/String/force encoding|String.force_encoding]]</code>. هكذا تخبر لغة روبي ما هو التّرميز الصحيح للسّلسلة النصّية.
أولاً، من الممكن ضبط ترميز سلسلة نصّية إلى ترميز جديد من دون تغيير تمثيل البايت الداخلي للسّلسلة النصّية، وذلك من خلال String.force_encoding. هكذا تخبر لغة روبي ما هو التّرميز الصحيح للسّلسلة النصّية.
<syntaxhighlight lang="ruby">
 
string
string
 
#=> "R\xC3\xA9sum\xC3\xA9"
<nowiki>#</nowiki>=> "R\xC3\xA9sum\xC3\xA9"
 
string.encoding
string.encoding
 
#=> #<Encoding:ISO-8859-1>
<nowiki>#</nowiki>=> #<Encoding:ISO-8859-1>
 
string.force_encoding(Encoding::UTF_8)
string.force_encoding(Encoding::UTF_8)
 
#=> "R\u00E9sum\u00E9"
<nowiki>#</nowiki>=> "R\u00E9sum\u00E9"
</syntaxhighlight>
 
* ثانياً، يمكننا تنفيذ عمليّة تبديل ترميز (transcode) السّلسلة، مثل تبديل تمثيل البايت الداخلي الخاص بها إلى ترميز آخر. هذا يسبّب تحوّل ترميزها الموافق إلى ترميز آخر. ألقِ نظرة على التابع <code>[[Ruby/String/encode|String.encode]]</code> للمزيد حول أشكال تحويل الترميز المختلفة، وعلى الصنف <code>[[Ruby/Encoding/Converter|Encoding::Converter]]</code> من أجل تحكّم أكبر بهذه العمليّة.
ثانياً، يمكننا تنفيذ عمليّة تبديل ترميز (transcode) السّلسلة، مثل تبديل تمثيل البايت الداخلي الخاص بها إلى ترميز آخر. هذا يسبّب تحوّل ترميزها الموافق إلى ترميز آخر. ألقِ نظرة على التابع String.encode للمزيد حول أشكال تحويل الترميز المختلفة، وعلى الصنف Encoding::Converter من أجل تحكّم أكبر بهذه العمليّة.
<syntaxhighlight lang="ruby">
 
string
string
 
#=> "R\u00E9sum\u00E9"
<nowiki>#</nowiki>=> "R\u00E9sum\u00E9"
 
string.encoding
string.encoding
 
#=> #<Encoding:UTF-8>
<nowiki>#</nowiki>=> #<Encoding:UTF-8>
 
string = string.encode!(Encoding::ISO_8859_1)
string = string.encode!(Encoding::ISO_8859_1)
 
#=> "R\xE9sum\xE9"
<nowiki>#</nowiki>=> "R\xE9sum\xE9"
 
string.encoding
string.encoding
#=> #<Encoding::ISO-8859-1>


<nowiki>#</nowiki>=> #<Encoding::ISO-8859-1>
</syntaxhighlight>


== ترميز الشيفرة البرمجية (Script encoding) ==
== ترميز الشيفرة البرمجية (Script encoding) ==
سطر 69: سطر 48:
كل أسطر شيفرة روبي مرمزةٌ بترميز واحد حيث أن إضافة أي نص في الشيفرة المصدرية سوف يتْبع نفس التّرميز.
كل أسطر شيفرة روبي مرمزةٌ بترميز واحد حيث أن إضافة أي نص في الشيفرة المصدرية سوف يتْبع نفس التّرميز.


التّرميز الافتراضي لشيفرة روبي هو Encoding::UTF-8 في الاصدارات التي تلي الإصدار v2.0، ولكن يمكن تغييرها من خلال إضافة تعليق سحري (magic comment) في السطر الأول من الشيفرة المصدرية (أو السطر الثاني إذا كان هناك سطر shebang في البداية). يجب أن يحتوي التعليق على الكلمة coding أو الكلمة encoding متبوعةً بنقطتين ثم فراغ ثم اسم الترميز أو اسمه البديل. يوضح المثال التالي ذلك:
التّرميز الافتراضي لشيفرة روبي هو <code>Encoding::UTF-8</code> في الاصدارات التي تلي الإصدار v2.0، ولكن يمكن تغييرها من خلال إضافة تعليق سحري (magic comment) في السطر الأول من الشيفرة المصدرية (أو السطر الثاني إذا كان هناك سطر shebang في البداية). يجب أن يحتوي التعليق على الكلمة <code>coding</code> أو الكلمة <code>encoding</code> متبوعةً بنقطتين ثم فراغ ثم اسم الترميز أو اسمه البديل. يوضح المثال التالي ذلك:<syntaxhighlight lang="ruby">
 
# encoding: UTF-8
<nowiki>#</nowiki> encoding: UTF-8


"some string".encoding
"some string".encoding


<nowiki>#</nowiki>=> #<Encoding:UTF-8>
#=> #<Encoding:UTF-8>


</syntaxhighlight>
تعيد الكلمة المحجوزة __ENCODING__ ترميز الشيفرة البرمجية للملف الذي كُتبت فيه.
تعيد الكلمة المحجوزة __ENCODING__ ترميز الشيفرة البرمجية للملف الذي كُتبت فيه.
 
<syntaxhighlight lang="ruby">
<nowiki>#</nowiki> encoding: ISO-8859-1
# encoding: ISO-8859-1


__ENCODING__
__ENCODING__
#=> #<Encoding:ISO-8859-1>


<nowiki>#</nowiki>=> #<Encoding:ISO-8859-1>


سيغيّر الأمر ruby -K التّرميز الافتراضي المَحلّي، لكن هذا غير مستحسن. يجب أن يوضّح الترميز المستعمل في ملفات روبي المصدرية من خلال تعليق سحري (magic comment) حتى عندما تعتمد فقط على سلاسل US-ASCII أو التّعابير النمطية (regular expressions).
</syntaxhighlight>سيغيّر الأمر <code>ruby -K</code> التّرميز الافتراضي المَحلّي، لكن هذا غير مستحسن. يجب أن يوضّح الترميز المستعمل في ملفات روبي المصدرية من خلال تعليق سحري (magic comment) حتى عندما تعتمد فقط على سلاسل <code>US-ASCII</code> أو التّعابير النمطية (regular expressions).


== الترميز المحلي (Locale encoding) ==
== الترميز المحلي (Locale encoding) ==
هو ترميز البيئة الافتراضي، ويؤخذ غالبًا من المحليَّة (locale).
هو ترميز البيئة الافتراضي، ويؤخذ غالبًا من المحليَّة (locale).


ألقِ نظرة على التابع locale_charmap::، والتابع ‎::find('locale')‎.
ألقِ نظرة على التابع <code>[[Ruby/Encoding/locale charmap|locale_charmap::]]</code>، والتابع <code>[[Ruby/Encoding/find|‎::find('locale')]]</code>‎.


== ترميز نظام الملفات (Filesystem encoding) ==
== ترميز نظام الملفات (Filesystem encoding) ==
هو التّرميز الافتراضي للسّلاسل النصّية لنظام ملفات البيئة. يُستخدم مع النصوص التي تمثل أسماء الملفّات أو مساراتها.
هو التّرميز الافتراضي للسّلاسل النصّية لنظام ملفات البيئة. يُستخدم مع النصوص التي تمثل أسماء الملفّات أو مساراتها.


ألقِ نظرة على التابع (‘find(‘filesystem::
ألقِ نظرة على التابع [[Ruby/Encoding/find|(‘find(‘filesystem::]].


== الترميز الخارجي (External encoding) ==
== الترميز الخارجي (External encoding) ==
كل كائن من النوع IO (إدخال وإخراج) لديه ترميز خارجي يدلّ لغة روبي على التّرميز الواجب استعماله لقراءة البيانات منه. تضبط روبي دومًا التّرميز الخارجي للكائن IO إلى التّرميز الخارجي الافتراضي. يحدَّد هذا التّرميز من قبل التّرميز المحلّي أو من قبل المفسِّر (interpreter) عبر استعمال الخيار E-. يعيد التابع default_external:: القيمة الحاليّة للترميز الخارجي.
كل كائن من النوع IO (إدخال وإخراج) لديه ترميز خارجي يدلّ لغة روبي على التّرميز الواجب استعماله لقراءة البيانات منه. تضبط روبي دومًا التّرميز الخارجي للكائن IO إلى التّرميز الخارجي الافتراضي. يحدَّد هذا التّرميز من قبل التّرميز المحلّي أو من قبل المفسِّر (interpreter) عبر استعمال الخيار <code>E-</code>. يعيد التابع <code>[[Ruby/Encoding/default external|default_external::]]</code> القيمة الحاليّة للترميز الخارجي.<syntaxhighlight lang="ruby">
 
ENV["LANG"]
ENV["LANG"]
 
#=> "UTF-8"
<nowiki>#</nowiki>=> "UTF-8"
 
Encoding.default_external
Encoding.default_external
 
#=> #<Encoding:UTF-8>
<nowiki>#</nowiki>=> #<Encoding:UTF-8>


$ ruby -E ISO-8859-1 -e "p Encoding.default_external"
$ ruby -E ISO-8859-1 -e "p Encoding.default_external"
 
#<Encoding:ISO-8859-1>
<nowiki>#</nowiki><Encoding:ISO-8859-1>


$ LANG=C ruby -e 'p Encoding.default_external'
$ LANG=C ruby -e 'p Encoding.default_external'
#<Encoding:US-ASCII>


<nowiki>#</nowiki><Encoding:US-ASCII>


يُمْكن تحديد التّرميز الخارجي الافتراضي أيضًا من خلال التابع default_external‎، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التّغيير سوف تملك ترميزات متضاربة. استخدم ruby -E بدلاً منها لاستدعاء روبي مع التّرميز الخارجي الصّحيح.
</syntaxhighlight>يُمْكن تحديد التّرميز الخارجي الافتراضي أيضًا من خلال التابع <code>[[Ruby/Encoding/default external-3D|default_external‎]]</code>، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التّغيير سوف تملك ترميزات متضاربة. استخدم <code>ruby -E</code> بدلاً منها لاستدعاء روبي مع التّرميز الخارجي الصّحيح.


عندما تعلم أنّ التّرميز الفعلي لبيانات كائن IO مختلف عن التّرميز الخارجي الافتراضي، يمكنك إعادة تعيينه من خلال التابع IO.set_encoding أو تحديده عند إنشاء كائن IO جديد (انظر إلى الخيارات في التابع IO.new).
عندما تعلم أنّ التّرميز الفعلي لبيانات كائن <code>IO</code> مختلف عن التّرميز الخارجي الافتراضي، يمكنك إعادة تعيينه من خلال التابع <code>[[Ruby/IO/set encoding|IO.set_encoding]]</code> أو تحديده عند إنشاء كائن <code>IO</code> جديد (انظر إلى الخيارات في التابع <code>[[Ruby/IO/new|IO.new]]</code>).


== الترميز الداخلي (Internal encoding) ==
== الترميز الداخلي (Internal encoding) ==
لمعالجة بيانات كائن من النوع IO لديه ترميز داخلي مختلف عن ترميزه الخارجي، يمكنك ضبط ترميزه الدّاخلي بسهولة. ستستخدم روبي هذا التّرميز الداخلي من أجل تغيير ترميز البيانات (transcode) عند قراءتها من الكائن IO.
لمعالجة بيانات كائن من النوع <code>IO</code> لديه ترميز داخلي مختلف عن ترميزه الخارجي، يمكنك ضبط ترميزه الدّاخلي بسهولة. ستستخدم روبي هذا التّرميز الداخلي من أجل تغيير ترميز البيانات (transcode) عند قراءتها من الكائن <code>IO</code>.


من جهة أخرى، عندما تتم كتابة بيانات إلى كائن IO، يُغيَّر ترميزها من التّرميز الداخلي للتّرميز الخارجي للكائن IO.
من جهة أخرى، عندما تتم كتابة بيانات إلى كائن <code>IO</code>، يُغيَّر ترميزها من التّرميز الداخلي للتّرميز الخارجي للكائن <code>IO</code>.


يمكن تعيين التّرميز الداخلي لكائن IO من خلال التابع IO.set_encoding أو عند إنشاء كائن IO جديد (انظر إلى الخيارات المتاحة في صفحة التابع IO.new).
يمكن تعيين التّرميز الداخلي لكائن <code>IO</code> من خلال التابع <code>[[Ruby/IO/set encoding|IO.set_encoding]]</code> أو عند إنشاء كائن <code>IO</code> جديد (انظر إلى الخيارات المتاحة في صفحة التابع <code>[[Ruby/IO/new|IO.new]]</code>).


عملية تعيين التّرميز الداخلي اختيارية وعندما لا يتم تعيينه، تُستعمَل القيمة الافتراضية لهذا الترميز. إذا ضُبِط التّرميز الافتراضي إلى قيمة عدمية (nil) بشكل غير مباشر، فلن تحدث أي عمليّة تحويل.
عملية تعيين التّرميز الداخلي اختيارية وعندما لا يتم تعيينه، تُستعمَل القيمة الافتراضية لهذا الترميز. إذا ضُبِط التّرميز الافتراضي إلى قيمة عدمية (nil) بشكل غير مباشر، فلن تحدث أي عمليّة تحويل.


يمكن تعيين التّرميز الدّاخلي الافتراضي عبر المفسر (interpreter) من خلال الخيار E-. يعيد التابع ‎::default_internal التّرميز الداخلي الحالي المستخدم.
يمكن تعيين التّرميز الدّاخلي الافتراضي عبر المفسر (interpreter) من خلال الخيار <code>ruby -E</code>. يعيد التابع ‎<code>[[Ruby/Encoding/default internal|::default_internal]]</code> التّرميز الداخلي الحالي المستخدم.<syntaxhighlight lang="ruby">
 
$ ruby -e 'p Encoding.default_internal'
$ ruby -e 'p Encoding.default_internal'
nil
nil


$ ruby -E ISO-8859-1:UTF-8 -e "p [Encoding.default_external, \
$ ruby -E ISO-8859-1:UTF-8 -e "p [Encoding.default_external, \
  Encoding.default_internal]"
[#<Encoding:ISO-8859-1>, #<Encoding:UTF-8>]


 Encoding.default_internal]"
[#<Encoding:ISO-8859-1>, #<Encoding:UTF-8>]


يمكن تعيين التّرميز الدّاخلي الافتراضي أيضًا من خلال التابع default_internal‎، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التغيير سوف تملك ترميزات متضاربة. استخدم الأمر ruby -E بدلاً منها لاستدعاء روبي مع التّرميز الداخلي الصّحيح.
</syntaxhighlight>يمكن تعيين التّرميز الدّاخلي الافتراضي أيضًا من خلال التابع <code>[[Ruby/Encoding/default internal-3D|default_internal‎]]</code>، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التغيير سوف تملك ترميزات متضاربة. استخدم الأمر <code>ruby -E</code> بدلاً منها لاستدعاء روبي مع التّرميز الداخلي الصّحيح.


== مثال عن ترميز الكائن IO ==
== مثال عن ترميز الكائن IO ==
في المثال التّالي، يُغيَّر ترميز السلسلة النصّية "Ru00E9sumu00E9" المرمزة بالتّرميز UTF-8 بهدف إظهارها بالترميز ISO-8895-ثمّ قراءتها مرّة أخرى وتغيير ترميزها إلى UTF-8:
في المثال التّالي، يُغيَّر ترميز السلسلة النصّية "Ru00E9sumu00E9" المرمزة بالتّرميز <code>UTF-8</code> بهدف إظهارها بالترميز <code>ISO-8895-1</code>، ثمّ قراءتها مرّة أخرى وتغيير ترميزها إلى <code>UTF-8</code>:<syntaxhighlight lang="ruby">
 
string = "R\u00E9sum\u00E9"
string = "R\u00E9sum\u00E9"


open("transcoded.txt", "w:ISO-8859-1") do |io|
open("transcoded.txt", "w:ISO-8859-1") do |io|
 
  io.write(string)
 io.write(string)
 
end
end


puts "raw text:"
puts "raw text:"
p File.binread("transcoded.txt")
p File.binread("transcoded.txt")
puts
puts


open("transcoded.txt", "r:ISO-8859-1:UTF-8") do |io|
open("transcoded.txt", "r:ISO-8859-1:UTF-8") do |io|
 
  puts "transcoded text:"
 puts "transcoded text:"
  p io.read
 
 p io.read
 
end
end


أثناء كتابة الملف، لا يكون التّرميز الداخلي محدّدًا لأنه يُستعمَل أثناء القراءة فقط. بينما عند قراءة الملف، يجب أن يحدّد كلًّا من التّرميزين الدّاخلي والخارجي للحصول على نتيجة صحيحة.
</syntaxhighlight>أثناء كتابة الملف، لا يكون التّرميز الداخلي محدّدًا لأنه يُستعمَل أثناء القراءة فقط. بينما عند قراءة الملف، يجب أن يحدّد كلًّا من التّرميزين الدّاخلي والخارجي للحصول على نتيجة صحيحة.<syntaxhighlight lang="ruby">
 
$ ruby t.rb
$ ruby t.rb
raw text:
raw text:
"R\xE9sum\xE9"
"R\xE9sum\xE9"


transcoded text:
transcoded text:
"R\u00E9sum\u00E9"


"R\u00E9sum\u00E9"
</syntaxhighlight>


== توابع الصنف العامة (Public Class Methods) ==
== توابع الصنف العامة (Public Class Methods) ==


=== <code>aliases</code> ===
=== <code>[[Ruby/Encoding/aliases|aliases]]</code> ===
يُعيد التّابع aliases الأسماء البديلة وجميع أسماء الترميزات الأصلية المتاحة.
يُعيد الأسماء البديلة وجميع أسماء الترميزات الأصلية المتاحة.


=== <code>?compatible</code> ===
=== <code>[[Ruby/Encoding/compatible-3F|?compatible]]</code> ===
يتحقّق التابع compatible?‎ من توافق كائنين مع بعضهما بعضًا.
يتحقّق من توافق كائنين مع بعضهما بعضًا.


=== <code>default_external::</code> ===
=== <code>[[Ruby/Encoding/default external|default_external::]]</code> ===
يُعيد التابع default_external:: قيمة الترميز الخارجي الافتراضية.
يُعيد قيمة الترميز الخارجي الافتراضية.


=== <code>default_external</code> ===
=== <code>[[Ruby/Encoding/default external-3D|default_external]]</code> ===
يضبط التابع default_external التّرميز الخارجي الافتراضي.
يضبط التّرميز الخارجي الافتراضي.


=== <code>default_internal::</code> ===
=== <code>[[Ruby/Encoding/default internal|default_internal::]]</code> ===
يُعيد التّابع default_internal:: قيمة التّرميز الداخلي الافتراضية.
يُعيد قيمة التّرميز الداخلي الافتراضية.


=== <code>default_internal</code> ===
=== <code>[[Ruby/Encoding/default internal-3D|default_internal]]</code> ===
يضبط التّابع default_internal القيمة الافتراضية للتّرميز الداخلي أو يحذفها عند تعيين القيمة nil.
يضبط القيمة الافتراضية للتّرميز الداخلي أو يحذفها عند تعيين القيمة nil.


=== <code>find</code> ===
=== <code>[[Ruby/Encoding/find|find]]</code> ===
يبحث التّابع find عن ترميز باسم محدّد.
يبحث عن ترميز باسم محدّد.


=== <code>list</code> ===
=== <code>[[Ruby/Encoding/list|list]]</code> ===
يُعيد التّابع list قائمةً بالترميزات المُحمّلة (loaded encodings).
يُعيد قائمةً بالترميزات المُحمّلة (loaded encodings).


=== <code>locale_charmap</code> ===
=== <code>[[Ruby/Encoding/locale charmap|locale_charmap]]</code> ===
يُعيد التّابع locale_chaemap اسم مخطّط توزيع الأحرف (charmap) للمحلية (locale) الحالية.
يُعيد اسم مخطّط توزيع الأحرف (charmap) للمحلية (locale) الحالية.


=== <code>name_list</code> ===
=== <code>[[Ruby/Encoding/name list|name_list]]</code> ===
يُعيد التّابع name_list قائمة بأسماء التّرميزات المتاحة.
يُعيد قائمة بأسماء التّرميزات المتاحة.


== توابع الكائن العامة (Public Instance Methods) ==
== توابع الكائن العامة (Public Instance Methods) ==


=== <code>?ascii_compatible</code> ===
=== <code>[[Ruby/Encoding/ascii compatible-3F|?ascii_compatible]]</code> ===
يتحقّق التّابع ascii_compatible?‎ من توافق ترميز محدد مع الترميز ASCII.
يتحقّق من توافق ترميز محدد مع الترميز ASCII.


=== <code>?dummy</code> ===
=== <code>[[Ruby/Encoding/dummy-3F|?dummy]]</code> ===
يتحقّق التّابع ?dummy من التّرميز الزّائف، وهو ترميزٌ لم يُتعامل به مع المحارف تعاملًا صحيحًا.
يتحقّق من التّرميز الزّائف، وهو ترميزٌ لم يُتعامل به مع المحارف تعاملًا صحيحًا.


=== <code>inspect</code> ===
=== <code>[[Ruby/Encoding/inspect|inspect]]</code> ===
يُعيد التّابع inspect‎ سلسلة نصية تمثل الترميز المعطى بشكل يخص المبرمجين فقط.
يُعيد سلسلة نصية تمثل الترميز المعطى بشكل يخص المبرمجين فقط.


=== <code>name</code> ===
=== <code>[[Ruby/Encoding/name|name]]</code> ===
يُعيد التّابع name اسم التّرميز الفعلي لترميز محدد.
يُعيد اسم التّرميز الفعلي لترميز محدد.


=== <code>names</code> ===
=== <code>[[Ruby/Encoding/names|names]]</code> ===
يُعيد التّابع names اسم الترميز الفعلي لترميز محدد والأسماء البديلة الخاصّة به.
يُعيد اسم الترميز الفعلي لترميز محدد والأسماء البديلة الخاصّة به.


=== <code>replicate</code> ===
=== <code>[[Ruby/Encoding/replicate|replicate]]</code> ===
يُنشئ التّابع replicate نسخة مطابقة من الترميز الذي استدعي معه.
يُنشئ نسخة مطابقة من الترميز الذي استدعي معه.


=== <code>to_s</code> ===
=== <code>[[Ruby/Encoding/to s|to_s]]</code> ===
يُعيد التّابع to_s اسم التّرميز الفعلي لترميز محدد.
يُعيد اسم التّرميز الفعلي لترميز محدد.


== مصادر ==
== مصادر ==

المراجعة الحالية بتاريخ 12:36، 21 نوفمبر 2018

يمثل الصنف Encoding ترميز المحارف الذي يمكننا استخدامه في لغة روبي. تُعرَّف النّسخة المنشأة من الصنف Encoding بأنّها ثابتٌ (constant) يندرج ضمن مجال أسماء الصنف (encoding namespace)؛ يكون لها اسم، واسم بديل (Alias) اختياري.

Encoding::ISO_8859_1.name
#=> "ISO-8859-1"

Encoding::ISO_8859_1.names
#=> ["ISO-8859-1", "ISO8859-1"]

التّوابع (methods) في لغة روبي التي تتعامل مع التّرميزات تعيد أو تقبل النسخ Encoding على شكل وسيط (عندما يقبل التّابع كائنًا على شكل وسيط، يمكن عندها أن نستخدم اسم أو لقب الترميز عوضًا عن الكائن).

"some string".encoding
#=> #<Encoding:UTF-8>

string = "some string".encode(Encoding::ISO_8859_1)
#=> "some string"
string.encoding
#=> #<Encoding:ISO-8859-1>

"some string".encode "ISO-8859-1"
#=> "some string"

الترميز Encoding::ASCII_8BIT هو ترميز خاص يستخدم عادةً مع السلاسل النصية التي بحجم بايت (byte string)، وليس مع السلاسل النصية المحرفية (character string)، ولكن كما يوحي الاسم، فإن رموزه التي تقع ضمن مجال الجدول ASCII تعدُّ على أنها محارف ASCII. هذا مفيد عندما تستخدم محارف ذات ترميز ASCII-8BIT مع محارف أخرى ذات ترميز ASCII.

تغيير الترميز (Changing an encoding)

يمكن تغيير التّرميز الخاص بسلسلة نصّية (string) من خلال طريقتين مختلفتين:

  • أولاً، من الممكن ضبط ترميز سلسلة نصّية إلى ترميز جديد من دون تغيير تمثيل البايت الداخلي للسّلسلة النصّية، وذلك من خلال String.force_encoding. هكذا تخبر لغة روبي ما هو التّرميز الصحيح للسّلسلة النصّية.
string
#=> "R\xC3\xA9sum\xC3\xA9"
string.encoding
#=> #<Encoding:ISO-8859-1>
string.force_encoding(Encoding::UTF_8)
#=> "R\u00E9sum\u00E9"
  • ثانياً، يمكننا تنفيذ عمليّة تبديل ترميز (transcode) السّلسلة، مثل تبديل تمثيل البايت الداخلي الخاص بها إلى ترميز آخر. هذا يسبّب تحوّل ترميزها الموافق إلى ترميز آخر. ألقِ نظرة على التابع String.encode للمزيد حول أشكال تحويل الترميز المختلفة، وعلى الصنف Encoding::Converter من أجل تحكّم أكبر بهذه العمليّة.
string
#=> "R\u00E9sum\u00E9"
string.encoding
#=> #<Encoding:UTF-8>
string = string.encode!(Encoding::ISO_8859_1)
#=> "R\xE9sum\xE9"
string.encoding
#=> #<Encoding::ISO-8859-1>

ترميز الشيفرة البرمجية (Script encoding)

كل أسطر شيفرة روبي مرمزةٌ بترميز واحد حيث أن إضافة أي نص في الشيفرة المصدرية سوف يتْبع نفس التّرميز.

التّرميز الافتراضي لشيفرة روبي هو Encoding::UTF-8 في الاصدارات التي تلي الإصدار v2.0، ولكن يمكن تغييرها من خلال إضافة تعليق سحري (magic comment) في السطر الأول من الشيفرة المصدرية (أو السطر الثاني إذا كان هناك سطر shebang في البداية). يجب أن يحتوي التعليق على الكلمة coding أو الكلمة encoding متبوعةً بنقطتين ثم فراغ ثم اسم الترميز أو اسمه البديل. يوضح المثال التالي ذلك:

# encoding: UTF-8

"some string".encoding

#=> #<Encoding:UTF-8>

تعيد الكلمة المحجوزة __ENCODING__ ترميز الشيفرة البرمجية للملف الذي كُتبت فيه.

# encoding: ISO-8859-1

__ENCODING__
#=> #<Encoding:ISO-8859-1>

سيغيّر الأمر ruby -K التّرميز الافتراضي المَحلّي، لكن هذا غير مستحسن. يجب أن يوضّح الترميز المستعمل في ملفات روبي المصدرية من خلال تعليق سحري (magic comment) حتى عندما تعتمد فقط على سلاسل US-ASCII أو التّعابير النمطية (regular expressions).

الترميز المحلي (Locale encoding)

هو ترميز البيئة الافتراضي، ويؤخذ غالبًا من المحليَّة (locale).

ألقِ نظرة على التابع locale_charmap::، والتابع ‎::find('locale')‎.

ترميز نظام الملفات (Filesystem encoding)

هو التّرميز الافتراضي للسّلاسل النصّية لنظام ملفات البيئة. يُستخدم مع النصوص التي تمثل أسماء الملفّات أو مساراتها.

ألقِ نظرة على التابع (‘find(‘filesystem::.

الترميز الخارجي (External encoding)

كل كائن من النوع IO (إدخال وإخراج) لديه ترميز خارجي يدلّ لغة روبي على التّرميز الواجب استعماله لقراءة البيانات منه. تضبط روبي دومًا التّرميز الخارجي للكائن IO إلى التّرميز الخارجي الافتراضي. يحدَّد هذا التّرميز من قبل التّرميز المحلّي أو من قبل المفسِّر (interpreter) عبر استعمال الخيار E-. يعيد التابع default_external:: القيمة الحاليّة للترميز الخارجي.

ENV["LANG"]
#=> "UTF-8"
Encoding.default_external
#=> #<Encoding:UTF-8>

$ ruby -E ISO-8859-1 -e "p Encoding.default_external"
#<Encoding:ISO-8859-1>

$ LANG=C ruby -e 'p Encoding.default_external'
#<Encoding:US-ASCII>

يُمْكن تحديد التّرميز الخارجي الافتراضي أيضًا من خلال التابع default_external‎، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التّغيير سوف تملك ترميزات متضاربة. استخدم ruby -E بدلاً منها لاستدعاء روبي مع التّرميز الخارجي الصّحيح.

عندما تعلم أنّ التّرميز الفعلي لبيانات كائن IO مختلف عن التّرميز الخارجي الافتراضي، يمكنك إعادة تعيينه من خلال التابع IO.set_encoding أو تحديده عند إنشاء كائن IO جديد (انظر إلى الخيارات في التابع IO.new).

الترميز الداخلي (Internal encoding)

لمعالجة بيانات كائن من النوع IO لديه ترميز داخلي مختلف عن ترميزه الخارجي، يمكنك ضبط ترميزه الدّاخلي بسهولة. ستستخدم روبي هذا التّرميز الداخلي من أجل تغيير ترميز البيانات (transcode) عند قراءتها من الكائن IO.

من جهة أخرى، عندما تتم كتابة بيانات إلى كائن IO، يُغيَّر ترميزها من التّرميز الداخلي للتّرميز الخارجي للكائن IO.

يمكن تعيين التّرميز الداخلي لكائن IO من خلال التابع IO.set_encoding أو عند إنشاء كائن IO جديد (انظر إلى الخيارات المتاحة في صفحة التابع IO.new).

عملية تعيين التّرميز الداخلي اختيارية وعندما لا يتم تعيينه، تُستعمَل القيمة الافتراضية لهذا الترميز. إذا ضُبِط التّرميز الافتراضي إلى قيمة عدمية (nil) بشكل غير مباشر، فلن تحدث أي عمليّة تحويل.

يمكن تعيين التّرميز الدّاخلي الافتراضي عبر المفسر (interpreter) من خلال الخيار ruby -E. يعيد التابع ‎::default_internal التّرميز الداخلي الحالي المستخدم.

$ ruby -e 'p Encoding.default_internal'
nil

$ ruby -E ISO-8859-1:UTF-8 -e "p [Encoding.default_external, \
  Encoding.default_internal]"
[#<Encoding:ISO-8859-1>, #<Encoding:UTF-8>]

يمكن تعيين التّرميز الدّاخلي الافتراضي أيضًا من خلال التابع default_internal‎، ولكن لا يجدر بك فعل ذلك إذ أن السّلاسل النّصية المضافة قبل وبعد التغيير سوف تملك ترميزات متضاربة. استخدم الأمر ruby -E بدلاً منها لاستدعاء روبي مع التّرميز الداخلي الصّحيح.

مثال عن ترميز الكائن IO

في المثال التّالي، يُغيَّر ترميز السلسلة النصّية "Ru00E9sumu00E9" المرمزة بالتّرميز UTF-8 بهدف إظهارها بالترميز ISO-8895-1، ثمّ قراءتها مرّة أخرى وتغيير ترميزها إلى UTF-8:

string = "R\u00E9sum\u00E9"

open("transcoded.txt", "w:ISO-8859-1") do |io|
  io.write(string)
end

puts "raw text:"
p File.binread("transcoded.txt")
puts

open("transcoded.txt", "r:ISO-8859-1:UTF-8") do |io|
  puts "transcoded text:"
  p io.read
end

أثناء كتابة الملف، لا يكون التّرميز الداخلي محدّدًا لأنه يُستعمَل أثناء القراءة فقط. بينما عند قراءة الملف، يجب أن يحدّد كلًّا من التّرميزين الدّاخلي والخارجي للحصول على نتيجة صحيحة.

$ ruby t.rb
raw text:
"R\xE9sum\xE9"

transcoded text:
"R\u00E9sum\u00E9"

توابع الصنف العامة (Public Class Methods)

aliases

يُعيد الأسماء البديلة وجميع أسماء الترميزات الأصلية المتاحة.

?compatible

يتحقّق من توافق كائنين مع بعضهما بعضًا.

default_external::

يُعيد قيمة الترميز الخارجي الافتراضية.

default_external

يضبط التّرميز الخارجي الافتراضي.

default_internal::

يُعيد قيمة التّرميز الداخلي الافتراضية.

default_internal

يضبط القيمة الافتراضية للتّرميز الداخلي أو يحذفها عند تعيين القيمة nil.

find

يبحث عن ترميز باسم محدّد.

list

يُعيد قائمةً بالترميزات المُحمّلة (loaded encodings).

locale_charmap

يُعيد اسم مخطّط توزيع الأحرف (charmap) للمحلية (locale) الحالية.

name_list

يُعيد قائمة بأسماء التّرميزات المتاحة.

توابع الكائن العامة (Public Instance Methods)

?ascii_compatible

يتحقّق من توافق ترميز محدد مع الترميز ASCII.

?dummy

يتحقّق من التّرميز الزّائف، وهو ترميزٌ لم يُتعامل به مع المحارف تعاملًا صحيحًا.

inspect

يُعيد سلسلة نصية تمثل الترميز المعطى بشكل يخص المبرمجين فقط.

name

يُعيد اسم التّرميز الفعلي لترميز محدد.

names

يُعيد اسم الترميز الفعلي لترميز محدد والأسماء البديلة الخاصّة به.

replicate

يُنشئ نسخة مطابقة من الترميز الذي استدعي معه.

to_s

يُعيد اسم التّرميز الفعلي لترميز محدد.

مصادر