ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።

ገንቢ ከሆንክ እና ኢንኮዲንግ የመምረጥ ስራ ካጋጠመህ ዩኒኮድ ሁል ጊዜ ትክክለኛ መፍትሄ ይሆናል። የተወሰነው የውክልና ዘዴ በዐውደ-ጽሑፉ ላይ የተመሰረተ ነው, ግን ብዙውን ጊዜ እዚህም ሁለንተናዊ መልስ አለ - UTF-8. ጥሩው ነገር ሁሉንም የዩኒኮድ ቁምፊዎችን ያለምንም ወጪ እንድትጠቀም ይፈቅድልሃል እንዲሁ በአብዛኛዎቹ ሁኔታዎች ብዙ ባይት. እውነት ነው፣ ከላቲን ፊደላት በላይ ለሚጠቀሙ ቋንቋዎች “ብዙ አይደለም” ቢያንስ ነው። ሁለት ባይት በቁምፊ. ወደ 256 የሚገኙ ቁምፊዎች ብቻ የሚገድቡን ወደ ቅድመ-ታሪክ ኢንኮዲንግ ሳንመለስ የተሻለ ማድረግ እንችላለን?

ከዚህ በታች ይህንን ጥያቄ ለመመለስ ባደረኩት ሙከራ እራስዎን በደንብ እንዲያውቁ እና በአብዛኛዎቹ የአለም ቋንቋዎች መስመሮችን በ UTF-8 ውስጥ ሳይጨምሩ በአንፃራዊ ቀላል ስልተ ቀመር ተግባራዊ ለማድረግ ሀሳብ አቀርባለሁ።

ማስተባበያ ወዲያውኑ ጥቂት አስፈላጊ ቦታዎችን አደርጋለሁ፡- የተገለጸው መፍትሔ ለ UTF-8 ሁለንተናዊ ምትክ ሆኖ አይሰጥም, በጠባብ የጉዳይ ዝርዝር ውስጥ ብቻ ተስማሚ ነው (ከዚህ በታች በእነርሱ ላይ ተጨማሪ), እና በምንም አይነት ሁኔታ ከሶስተኛ ወገን ኤፒአይዎች (ስለእሱ እንኳን የማያውቁት) ጋር ለመግባባት ጥቅም ላይ መዋል የለበትም. በጣም ብዙ ጊዜ አጠቃላይ-ዓላማ መጭመቂያ ስልተ ቀመሮች (ለምሳሌ, deflate) ትልቅ መጠን ያላቸውን የጽሑፍ መረጃዎችን ለማከማቸት ተስማሚ ናቸው. በተጨማሪም ፣ ቀድሞውኑ የእኔን መፍትሄ በመፍጠር ሂደት ውስጥ ፣ በዩኒኮድ ራሱ ውስጥ አንድ ነባር ደረጃ አገኘሁ ፣ እሱም ተመሳሳይ ችግርን የሚፈታ - ​​በተወሰነ ደረጃ የተወሳሰበ (እና ብዙውን ጊዜ የከፋ) ነው ፣ ግን አሁንም ተቀባይነት ያለው ደረጃ ነው ፣ እና ብቻ አይደለም ። በጉልበቱ ላይ አንድ ላይ. ስለ እሱም እነግራችኋለሁ።

ስለ ዩኒኮድ እና UTF-8

ለመጀመር, ስለ ምን እንደሆነ ጥቂት ቃላት ዩኒኮድ и በ UTF-8.

እንደሚታወቀው፣ ባለ 8-ቢት ኢንኮዲንግ ታዋቂ ነበር። በእነሱ, ሁሉም ነገር ቀላል ነበር: 256 ቁምፊዎች ከ 0 እስከ 255 ቁጥሮች ሊቆጠሩ ይችላሉ, እና ከ 0 እስከ 255 ያሉት ቁጥሮች እንደ አንድ ባይት ሊወከሉ ይችላሉ. ወደ መጀመሪያው ከተመለስን ፣ የ ASCII ኢንኮዲንግ ሙሉ በሙሉ በ 7 ቢት ብቻ የተገደበ ነው ፣ ስለሆነም በባይት ውክልና ውስጥ በጣም አስፈላጊው ቢት ዜሮ ነው ፣ እና አብዛኛዎቹ 8-ቢት ኢንኮዲንግዎች ከእሱ ጋር ተኳሃኝ ናቸው (እነሱ በ “ላይኛው” ውስጥ ብቻ ይለያያሉ) ክፍል, በጣም አስፈላጊው ቢት አንድ ከሆነ).

ዩኒኮድ ከነዚያ ኢንኮዲንግ እንዴት ይለያል እና ለምንድነው ብዙ ልዩ ውክልናዎች ከሱ ጋር የተያያዙት - UTF-8፣ UTF-16 (BE እና LE)፣ UTF-32? በቅደም ተከተል እንየው።

መሠረታዊው የዩኒኮድ ስታንዳርድ የሚገልጸው በገጸ-ባህሪያት መካከል ያለውን ግንኙነት ብቻ ነው (እና በአንዳንድ ሁኔታዎች የቁምፊዎች ግላዊ ክፍሎች) እና ቁጥራቸው። እና በዚህ መስፈርት ውስጥ ብዙ ሊሆኑ የሚችሉ ቁጥሮች አሉ - ከ 0x00 ወደ 0x10FFFF (1 ቁርጥራጮች)። በእንደዚህ ዓይነት ክልል ውስጥ ቁጥርን ወደ ተለዋዋጭ ለማስቀመጥ ከፈለግን 114 ወይም 112 ባይት አይበቃንም ነበር። እና ፕሮሰሰሮቻችን ከሶስት ባይት ቁጥሮች ጋር ለመስራት በጣም የተነደፉ ስላልሆኑ በአንድ ቁምፊ እስከ 1 ባይት ለመጠቀም እንገደዳለን! ይህ UTF-2 ነው, ግን በትክክል በዚህ "ብክነት" ምክንያት ይህ ቅርፀት ታዋቂ አይደለም.

እንደ እድል ሆኖ፣ በዩኒኮድ ውስጥ ያሉ የቁምፊዎች ቅደም ተከተል በዘፈቀደ አይደለም። የእነሱ ስብስብ በ 17 "የተከፈለ ነው.አውሮፕላኖችእያንዳንዳቸው 65536 () ይይዛሉ0x10000)ኮድ ነጥቦች" እዚህ የ "ኮድ ነጥብ" ጽንሰ-ሐሳብ ቀላል ነው የቁምፊ ቁጥርበዩኒኮድ ተመድቦለታል። ነገር ግን ከላይ እንደተጠቀሰው በዩኒኮድ ውስጥ የግለሰብ ቁምፊዎች ብቻ ሳይሆን ክፍሎቻቸው እና የአገልግሎት ምልክቶችም (እና አንዳንድ ጊዜ ከቁጥሩ ጋር ምንም አይመሳሰልም - ምናልባት ለጊዜው, ለእኛ ግን ይህ በጣም አስፈላጊ አይደለም) የበለጠ ትክክል ነው ሁል ጊዜ በተለይ ስለ ቁጥሮች ብዛት ማውራት እንጂ ምልክቶችን አይደለም። ሆኖም ፣ በሚከተለው ውስጥ ፣ ለአጭር ጊዜ ፣ ​​ብዙውን ጊዜ “ምልክት” የሚለውን ቃል እጠቀማለሁ ፣ ይህም “የኮድ ነጥብ” የሚለውን ቃል ያሳያል ።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
የዩኒኮድ አውሮፕላኖች. እንደሚመለከቱት, አብዛኛው (ከ 4 እስከ 13 አውሮፕላኖች) አሁንም ጥቅም ላይ አልዋለም.

በጣም የሚያስደንቀው ነገር ቢኖር ሁሉም ዋናው “pulp” በዜሮ አውሮፕላን ውስጥ መገኘቱ ነው ፣ እሱ ይባላልመሰረታዊ ባለብዙ ቋንቋ አውሮፕላንአንድ መስመር ከዘመናዊ ቋንቋዎች በአንዱ (ቻይንኛን ጨምሮ) ጽሑፍ ከያዘ፣ ከዚህ አውሮፕላን ማለፍ አይችሉም። ግን የቀረውን የዩኒኮድ ክፍል መቁረጥ አይችሉም - ለምሳሌ ኢሞጂ በዋነኝነት የሚገኘው በ ቀጣዩ አውሮፕላን"ተጨማሪ ባለብዙ ቋንቋ አውሮፕላን"(ከ 0x10000 ወደ 0x1FFFF). ስለዚህ UTF-16 ይህን ያደርጋል: ሁሉም ቁምፊዎች ወደ ውስጥ ይወድቃሉ መሰረታዊ ባለብዙ ቋንቋ አውሮፕላን፣ “እንደሆነ” ከሚዛመደው ባለ ሁለት ባይት ቁጥር ጋር ተቀምጠዋል። ሆኖም ፣ በዚህ ክልል ውስጥ ያሉት አንዳንድ ቁጥሮች የተወሰኑ ቁምፊዎችን በጭራሽ አያመለክቱም ፣ ግን ከዚህ ጥንድ ባይት በኋላ ሌላን ግምት ውስጥ ማስገባት እንዳለብን ያመለክታሉ - የእነዚህን አራት ባይት እሴቶች በአንድ ላይ በማጣመር ፣ የሚሸፍነውን ቁጥር እናገኛለን ትክክለኛው የዩኒኮድ ክልል። ይህ ሃሳብ "ተተኪ ጥንዶች" ተብሎ ይጠራል - ስለእነሱ ሰምተው ይሆናል.

ስለዚህ UTF-16 በ"ኮድ ነጥብ" ሁለት ወይም (በጣም አልፎ አልፎ) አራት ባይት ያስፈልገዋል። ይህ ሁልጊዜ አራት ባይት ከመጠቀም የተሻለ ነው, ነገር ግን የላቲን (እና ሌሎች የ ASCII ቁምፊዎች) በዚህ መንገድ ሲቀመጡ ግማሹን ቦታ በዜሮዎች ላይ ያባክናል. UTF-8 ይህንን ለማስተካከል የተነደፈ ነው-ASCII በውስጡ ይይዛል, ልክ እንደበፊቱ, አንድ ባይት ብቻ; ኮዶች ከ 0x80 ወደ 0x7FF - ሁለት ባይት; ከ 0x800 ወደ 0xFFFF - ሶስት, እና ከ 0x10000 ወደ 0x10FFFF - አራት. በአንድ በኩል, የላቲን ፊደላት ጥሩ ሆኗል: ከ ASCII ጋር ያለው ተኳሃኝነት ተመልሷል, እና ስርጭቱ ከ 1 እስከ 4 ባይት "የተዘረጋ" ነው. ግን ከላቲን ሌላ ፊደላት ፣ ወዮ ፣ ከ UTF-16 ጋር ሲነፃፀሩ በምንም መንገድ አይጠቅሙም ፣ እና ብዙዎች አሁን ከሁለት ይልቅ ሶስት ባይት ይፈልጋሉ - በሁለት-ባይት መዝገብ የተሸፈነው ክልል በ 32 ጊዜ ቀንሷል ፣ 0xFFFF ወደ 0x7FF, እና ቻይንኛም ሆነ, ለምሳሌ, ጆርጂያኛ በውስጡ አልተካተቱም. ሲሪሊክ እና ሌሎች አምስት ፊደላት - ሁሬይ - እድለኛ ፣ 2 ባይት በቁምፊ።

ይህ ለምን ይከሰታል? UTF-8 እንዴት የቁምፊ ኮዶችን እንደሚወክል እንይ፡
ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
ቁጥሮችን ለመወከል በቀጥታ በምልክቱ ምልክት የተደረገባቸው ቢት እዚህ ጥቅም ላይ ይውላሉ x. በሁለት-ባይት መዝገብ ውስጥ እንደዚህ ያሉ 11 ቢት (ከ 16 ውስጥ) ብቻ እንዳሉ ማየት ይቻላል. እዚህ ያሉት መሪ ቢትስ ረዳት ተግባር ብቻ ነው ያላቸው። በአራት ባይት መዝገብ 21 ከ 32 ቢት ለኮድ ​​ነጥብ ቁጥር ይመደባሉ - ሶስት ባይት (በአጠቃላይ 24 ቢት ይሰጣሉ) በቂ ይመስላል ፣ ግን የአገልግሎት ጠቋሚዎች በጣም ይበላሉ ።

ይህ መጥፎ ነው? እውነታ አይደለም. በአንድ በኩል፣ ስለ ቦታ ብዙ የምንጨነቅ ከሆነ፣ ሁሉንም ተጨማሪ ኢንትሮፒ እና ድግግሞሽን በቀላሉ የሚያስወግዱ የመጭመቂያ ስልተ ቀመሮች አሉን። በሌላ በኩል፣ የዩኒኮድ ግብ የሚቻለውን ሁሉን አቀፍ ኮድ መስጠት ነበር። ለምሳሌ፣ በUTF-8 የተመዘገበ መስመር ከዚህ ቀደም ከ ASCII ጋር ብቻ ይሰራ የነበረውን ኮድ እንዲሰጠን አደራ ልንል እንችላለን፣ እና ከ ASCII ክልል የመጣ ገጸ ባህሪ ያያል ብለን አንፈራም (ከሁሉም በኋላ በ UTF-8 ሁሉም) ባይት ከዜሮ ቢት ጀምሮ - ይህ በትክክል ASCII ነው)። እና ድንገት ከመጀመሪያው ጀምሮ ዲኮዲንግ ሳናደርግ (ወይም ከተበላሸው ክፍል በኋላ የተወሰነውን መረጃ ወደነበረበት ለመመለስ) ከትልቅ ገመድ ላይ ትንሽ ጅራትን ማቋረጥ ከፈለግን, ገጸ ባህሪ የሚጀምርበትን ማካካሻ ማግኘት ቀላል ይሆንልናል (በቂ ነው). ትንሽ ቅድመ ቅጥያ ያላቸውን ባይት ለመዝለል 10).

ለምን አዲስ ነገር ፈለሰፈ?

በተመሳሳይ ጊዜ፣ እንደ ዲፍላት ያሉ የመጭመቂያ ስልተ ቀመሮች በደንብ የማይተገበሩባቸው ሁኔታዎች፣ ነገር ግን የታመቀ የሕብረቁምፊዎችን ማከማቻ ማግኘት ይፈልጋሉ። በግሌ ስለ ግንባታ ሳስብ ይህን ችግር አጋጥሞኝ ነበር የታመቀ ቅድመ ቅጥያ ዛፍ በዘፈቀደ ቋንቋዎች ቃላትን ጨምሮ ለትልቅ መዝገበ ቃላት። በአንድ በኩል, እያንዳንዱ ቃል በጣም አጭር ነው, ስለዚህ መጭመቅ ውጤታማ አይሆንም. በሌላ በኩል፣ እኔ ያሰብኩት የዛፍ አተገባበር የተቀየሰው እያንዳንዱ ባይት የተከማቸ ሕብረቁምፊ የተለየ የዛፍ ወርድ ስለሚፈጥር ቁጥራቸውን መቀነስ በጣም ጠቃሚ ነበር። በእኔ ቤተ-መጽሐፍት ውስጥ Az.js (እንደ ውስጥ ፒሞርፊ2, በእሱ ላይ የተመሰረተ) ተመሳሳይ ችግር በቀላሉ ሊፈታ ይችላል - ሕብረቁምፊዎች የታሸጉ DAWG- መዝገበ-ቃላት ፣ እዚያ ውስጥ ተከማችቷል። ጥሩ የድሮ CP1251. ግን ፣ በቀላሉ ለመረዳት እንደሚቻለው ፣ ይህ በጥሩ ሁኔታ የሚሰራው ለተወሰነ ፊደል ብቻ ነው - በቻይንኛ አንድ መስመር ወደ እንደዚህ ዓይነት መዝገበ-ቃላት ሊታከል አይችልም።

ለየብቻ፣ በእንደዚህ አይነት የውሂብ መዋቅር ውስጥ UTF-8 ሲጠቀሙ የሚነሳውን አንድ ተጨማሪ ደስ የማይል ስሜትን ልብ ማለት እፈልጋለሁ። ከላይ ያለው ሥዕል የሚያሳየው አንድ ገፀ ባህሪ ሁለት ባይት ተብሎ ሲጻፍ ከቁጥሩ ጋር የተያያዙት ቢትስ በተከታታይ አይመጡም ነገር ግን በጥንድ ቢት ይለያያሉ 10 መሃል ላይ: 110xxxxx 10xxxxxx. በዚህ ምክንያት የሁለተኛው ባይት ዝቅተኛው 6 ቢት በቁምፊ ኮድ ውስጥ ሲፈስ (ማለትም ሽግግር ይከሰታል) 10111111 → 10000000), ከዚያም የመጀመሪያው ባይት እንዲሁ ይለወጣል. “p” የሚለው ፊደል በባይት እንደሚገለጽ ተገለጸ 0xD0 0xBF, እና ቀጣዩ "r" አስቀድሞ ነው 0xD1 0x80. በቅድመ-ቅጥያ ዛፍ ውስጥ, ይህ የወላጅ መስቀለኛ መንገድ ለሁለት መከፈልን ያመጣል - አንድ ለቅድመ ቅጥያ 0xD0, እና ሌላ ለ 0xD1 (ምንም እንኳን ሙሉው የሲሪሊክ ፊደሎች በሁለተኛው ባይት ብቻ ሊመሰጠሩ ይችላሉ)።

ምን አገኘሁ

ይህን ችግር ሲያጋጥመኝ, ጨዋታዎችን በቢት መጫወት ለመለማመድ ወሰንኩ, እና በተመሳሳይ ጊዜ ከዩኒኮድ አጠቃላይ መዋቅር ጋር በደንብ ለመተዋወቅ ወሰንኩ. ውጤቱም የUTF-C ኢንኮዲንግ ቅርጸት ("C" ለ የተጠጋጋ), በአንድ ኮድ ነጥብ ከ 3 ባይት ያልበለጠ እና ብዙ ጊዜ ብቻ እንዲያወጡ ያስችልዎታል ለጠቅላላው ኢንኮድ መስመር አንድ ተጨማሪ ባይት. ይህ በብዙ ASCII ባልሆኑ ፊደላት ላይ እንደዚህ ያለ ኢንኮዲንግ ወደመሆኑ ይመራል 30-60% ከ UTF-8 የበለጠ የታመቀ.

በቅጹ ውስጥ የመቀየሪያ እና የመፍታት ስልተ ቀመሮችን ትግበራ ምሳሌዎችን አቅርቤያለሁ ጃቫ ስክሪፕት እና ሂድ ቤተ-መጻሕፍትበኮድዎ ውስጥ በነፃነት ሊጠቀሙባቸው ይችላሉ። ግን አሁንም አፅንዖት እሰጣለሁ ከግንዛቤ አንጻር ይህ ቅርፀት “ብስክሌት” ሆኖ እንደሚቆይ እና እሱን እንዲጠቀሙበት አልመክርም። ለምን እንደሚያስፈልግዎ ሳያውቅ. ይህ አሁንም ከከባድ "የ UTF-8 መሻሻል" የበለጠ ሙከራ ነው. ቢሆንም፣ እዚያ ያለው ኮድ ብዙ አስተያየቶችን እና የፈተና ሽፋንን በጥሩ ሁኔታ፣ በአጭሩ ተጽፏል።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
የፈተና ውጤቶች እና ከ UTF-8 ጋር ማወዳደር

እኔም አደረግሁ ማሳያ ገጽ, የአልጎሪዝምን አፈፃፀም መገምገም የሚችሉበት, እና ከዚያ ስለ መርሆዎቹ እና የእድገት ሂደቱ የበለጠ እነግራችኋለሁ.

ተደጋጋሚ ንክኪዎችን በማስወገድ ላይ

በእርግጥ UTF-8ን እንደ መሰረት አድርጌ ወሰድኩ. በእሱ ውስጥ ሊለወጥ የሚችለው የመጀመሪያው እና በጣም ግልጽ የሆነው ነገር በእያንዳንዱ ባይት ውስጥ ያለውን የአገልግሎት ቢት ቁጥር መቀነስ ነው. ለምሳሌ, በ UTF-8 ውስጥ ያለው የመጀመሪያው ባይት ሁልጊዜም በሁለቱም ይጀምራል 0፣ ወይም ከ ጋር 11 - ቅድመ ቅጥያ 10 የሚከተሉት ባይት ብቻ ነው ያላቸው። ቅድመ ቅጥያውን እንተካ 11 ላይ 1, እና ለቀጣዮቹ ባይት ቅድመ ቅጥያዎችን ሙሉ በሙሉ እናስወግዳለን. ምን ይሆናል?

0xxxxxxx - 1 ባይት
10xxxxxx xxxxxxxx - 2 ባይት
110xxxxx xxxxxxxx xxxxxxxx - 3 ባይት

ቆይ የአራት ባይት መዝገብ የት አለ? ግን ከእንግዲህ አያስፈልግም - በሶስት ባይት ስንጽፍ አሁን 21 ቢት አለን እና ይህ ለሁሉም ቁጥሮች በቂ ነው ። 0x10FFFF.

እዚህ ምን መስዋዕትነት ከፍለናል? በጣም አስፈላጊው ነገር በጠባቂው ውስጥ ካለው የዘፈቀደ ቦታ የቁምፊ ድንበሮችን መለየት ነው. የዘፈቀደ ባይት ላይ መጠቆም እና የሚቀጥለውን ገጸ ባህሪ ከእሱ ማግኘት አንችልም። ይህ የእኛ ቅርጸት ገደብ ነው, በተግባር ግን ይህ በጣም አልፎ አልፎ አስፈላጊ ነው. ብዙውን ጊዜ በመጠባበቂያው ውስጥ ከመጀመሪያው (በተለይ ወደ አጭር መስመሮች ሲመጣ) መሮጥ እንችላለን.

ቋንቋዎችን በ 2 ባይት የመሸፈን ሁኔታ እንዲሁ የተሻለ ሆኗል-አሁን ባለ ሁለት ባይት ቅርጸት 14 ቢት ይሰጣል ፣ እና እነዚህ እስከ ኮዶች ድረስ ናቸው። 0x3FFF. ቻይናውያን እድለኞች አይደሉም (ገጸ ባህሪያቸው በአብዛኛው ከ 0x4E00 ወደ 0x9FFF), ነገር ግን ጆርጂያውያን እና ሌሎች ብዙ ሰዎች የበለጠ ይዝናናሉ - ቋንቋዎቻቸውም በገጸ ባህሪ 2 ባይት ይስማማሉ።

የመቀየሪያውን ሁኔታ ያስገቡ

አሁን ስለ መስመሮቹ ባህሪያት እናስብ. መዝገበ ቃላቱ ብዙውን ጊዜ በተመሳሳይ ፊደላት ገጸ-ባህሪያት የተፃፉ ቃላትን ይይዛል ፣ እና ይህ ለብዙ ሌሎች ጽሑፎችም እውነት ነው። ይህንን ፊደላት አንድ ጊዜ መጥቀስ ጥሩ ነው, ከዚያም በውስጡ ያለውን ፊደል ቁጥር ብቻ ይጠቁማል. በዩኒኮድ ሠንጠረዥ ውስጥ የቁምፊዎች ዝግጅት ይረዳናል እንይ።

ከላይ እንደተጠቀሰው, ዩኒኮድ ተከፍሏል አውሮፕላን እያንዳንዳቸው 65536 ኮዶች። ግን ይህ በጣም ጠቃሚ ክፍፍል አይደለም (ቀደም ሲል እንደተናገረው, ብዙውን ጊዜ በዜሮ አውሮፕላን ውስጥ እንገኛለን). የበለጠ ትኩረት የሚስበው በ መከፋፈል ነው። ብሎኮች። እነዚህ ክልሎች ከአሁን በኋላ ቋሚ ርዝመት አይኖራቸውም, እና የበለጠ ትርጉም ያላቸው ናቸው - እንደ አንድ ደንብ, እያንዳንዳቸው ከተመሳሳይ ፊደል ቁምፊዎችን ያጣምራሉ.

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
የቤንጋሊ ፊደላት ቁምፊዎችን የያዘ ብሎክ። እንደ አለመታደል ሆኖ ፣ በታሪካዊ ምክንያቶች ፣ ይህ በጣም ጥቅጥቅ ያለ ያልሆነ ማሸጊያ ምሳሌ ነው - 96 ቁምፊዎች በ128 የብሎክ ኮድ ነጥቦች ላይ በተመሰቃቀለ ሁኔታ ተበታትነዋል።

የብሎኮች ጅምር እና መጠኖቻቸው ሁል ጊዜ የ 16 ብዜቶች ናቸው - ይህ የሚደረገው በቀላሉ ለመመቻቸት ነው። በተጨማሪም ፣ ብዙ ብሎኮች የሚጀምሩት እና የሚጨርሱት በ 128 ወይም 256 ብዜቶች በሆኑ እሴቶች ነው - ለምሳሌ ፣ መሰረታዊ የሲሪሊክ ፊደላት ከ 256 ባይት ይወስዳል። 0x0400 ወደ 0x04FF. ይህ በጣም ምቹ ነው፡ ቅድመ ቅጥያውን አንዴ ካስቀመጥነው 0x04, ከዚያም ማንኛውም የሲሪሊክ ቁምፊ በአንድ ባይት ሊጻፍ ይችላል. እውነት ነው, በዚህ መንገድ ወደ ASCII (እና በአጠቃላይ ወደ ሌላ ማንኛውም ገጸ-ባህሪያት) ለመመለስ እድሉን እናጣለን. ስለዚህ ይህንን እናደርጋለን-

  1. ሁለት ባይት 10yyyyyy yxxxxxxx ቁጥር ያለው ምልክት ብቻ አይደለም yyyyyy yxxxxxxx, ግን ደግሞ መለወጥ የአሁኑ ፊደል ላይ yyyyyy y0000000 (ማለትም ከትንሽ ጉልህ ከሆኑት በስተቀር ሁሉንም ቢትስ እናስታውሳለን። 7 ቢት);
  2. አንድ ባይት 0xxxxxxx ይህ የአሁኑ የፊደል ገበታ ባህሪ ነው። በደረጃ 1 ላይ ባስታወስነው ማካካሻ ላይ መጨመር ብቻ ነው የሚያስፈልገው።ፊደልን ባንቀይርም ማካካሻው ዜሮ ነው፣ስለዚህ ከ ASCII ጋር ተኳሃኝነትን አስጠብቀናል።

እንዲሁም 3 ባይት ለሚፈልጉ ኮዶች፡-

  1. ሶስት ባይት 110yyyyy yxxxxxxx xxxxxxxx ከቁጥር ጋር ምልክት ያመልክቱ yyyyyy yxxxxxxx xxxxxxxx, ለውጥ የአሁኑ ፊደል ላይ yyyyyy y0000000 00000000 (ከታናናሾቹ በስተቀር ሁሉንም ነገር አስታውስ 15 ቢት) እና አሁን ያለንበትን ሳጥን ምልክት ያድርጉበት ረጅም ሁነታ (ፊደልን ወደ ሁለት-ባይት ሲቀይሩ, ይህን ባንዲራ እንደገና እናስጀምረዋለን);
  2. ሁለት ባይት 0xxxxxxx xxxxxxxx በረዥም ሁነታ የአሁኑ ፊደላት ባህሪ ነው. በተመሳሳይም ከደረጃ 1 ጀምሮ ካለው ማካካሻ ጋር እንጨምረዋለን። ልዩነቱ አሁን ሁለት ባይት እናነባለን (ምክንያቱም ወደዚህ ሁነታ ስለቀየርን)።

ጥሩ ይመስላል፡ አሁን ከተመሳሳይ ባለ 7-ቢት የዩኒኮድ ክልል ቁምፊዎችን መክተት ሲገባን መጀመሪያ ላይ 1 ተጨማሪ ባይት እና በአጠቃላይ አንድ ባይት በአንድ ቁምፊ እናጠፋለን።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
ከቀደምት ስሪቶች ውስጥ በአንዱ በመስራት ላይ። ቀድሞውንም UTF-8ን ይመታል፣ ነገር ግን አሁንም መሻሻል ያለበት ቦታ አለ።

ምን ይባስ? በመጀመሪያ፣ ቅድመ ሁኔታ አለን። የአሁኑ ፊደል ማካካሻ እና አመልካች ሳጥን ረጅም ሁነታ. ይህ የበለጠ ይገድበናል፡ አሁን ተመሳሳዩ ቁምፊዎች በተለያዩ አውዶች ውስጥ በተለያየ መንገድ ሊቀመጡ ይችላሉ። ንኡስ ሕብረቁምፊዎችን መፈለግ፣ ለምሳሌ፣ ይህንን ከግምት ውስጥ በማስገባት፣ ባይት በማነጻጸር ብቻ ሳይሆን መደረግ አለበት። በሁለተኛ ደረጃ ፣ ፊደሉን እንደቀየርን ፣ በ ASCII ቁምፊዎች ኢንኮዲንግ መጥፎ ሆነ (እና ይህ የላቲን ፊደል ብቻ ሳይሆን ፣ ክፍተቶችን ጨምሮ መሰረታዊ ስርዓተ-ነጥብም ነው) - ፊደሎችን እንደገና ወደ 0 መለወጥ ይፈልጋሉ ፣ ማለትም ፣ እንደገና ተጨማሪ ባይት (ከዚያም ሌላ ወደ ዋናው ነጥባችን እንመለስ)።

አንድ ፊደል ጥሩ ነው, ሁለት የተሻለ ነው

ከላይ ወደ ተገለጹት ሦስቱ ትንንሽ ቅድመ ቅጥያዎቻችንን በጥቂቱ ለመቀየር እንሞክር፡-

0xxxxxxx - 1 ባይት በተለመደው ሁነታ, 2 በረጅም ሁነታ
11xxxxxx - 1 ባይት
100xxxxx xxxxxxxx - 2 ባይት
101xxxxx xxxxxxxx xxxxxxxx - 3 ባይት

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።

አሁን በሁለት-ባይት መዝገብ ውስጥ አንድ ያነሰ የሚገኝ ትንሽ አለ - እስከ ኮድ ነጥቦች 0x1FFFአይደለም 0x3FFF. ሆኖም ፣ እሱ አሁንም ከድርብ-ባይት UTF-8 ኮዶች የበለጠ ትልቅ ነው ፣ በጣም የተለመዱ ቋንቋዎች አሁንም ይጣጣማሉ ፣ በጣም የሚታየው ኪሳራ ወድቋል ሂራጋና и ካታካናጃፓኖች አዝነዋል።

ይህ አዲስ ኮድ ምንድን ነው? 11xxxxxx? ይህ የ64 ቁምፊዎች መጠን ያለው ትንሽ “ስታሽ” ነው፣ ዋናውን ፊደላችንን ያሟላል፣ ስለዚህ ረዳት አልኩት (ረዳት) ፊደል። የአሁኑን ፊደላት ስንቀይር የአሮጌው ፊደል ቁራጭ ረዳት ይሆናል። ለምሳሌ፣ ከASCII ወደ ሲሪሊክ ቀይረናል - ስታሽ አሁን 64 ቁምፊዎችን ይዟል። የላቲን ፊደል፣ ቁጥሮች፣ ቦታ እና ኮማ (በASCII ባልሆኑ ጽሑፎች ውስጥ በጣም ተደጋጋሚ ማስገቢያዎች)። ወደ ASCII ይመለሱ - እና የሲሪሊክ ፊደላት ዋናው ክፍል ረዳት ሆሄያት ይሆናል።

ለሁለት ፊደላት ምስጋና ይግባው ፣ ፊደላትን ለመቀየር አነስተኛ ወጪዎችን በመጠቀም ብዙ ጽሑፎችን ማስተናገድ እንችላለን (ሥርዓተ-ነጥብ ብዙውን ጊዜ ወደ ASCII መመለስ ያስከትላል ፣ ግን ከዚያ በኋላ ከተጨማሪው ፊደል ብዙ ASCII ያልሆኑ ቁምፊዎችን እናገኛለን ፣ እንደገና መቀየር).

ጉርሻ፡ የንዑስ ፊደል ቅድመ ቅጥያ 11xxxxxx እና የመጀመሪያ ማካካሻውን እንዲሆን መምረጥ 0xC0ከ CP1252 ጋር ከፊል ተኳኋኝነት እናገኛለን። በሌላ አገላለጽ፣ በ CP1252 ውስጥ የተካተቱ ብዙ (ነገር ግን ሁሉም አይደሉም) የምዕራብ አውሮፓ ጽሑፎች በUTF-C ውስጥ ተመሳሳይ ይሆናሉ።

እዚህ ግን አንድ ችግር ይፈጠራል-ከዋናው ፊደል እንዴት ረዳት ማግኘት እንደሚቻል? ተመሳሳዩን ማካካሻ መተው ይችላሉ ፣ ግን - ወዮ - እዚህ የዩኒኮድ መዋቅር ቀድሞውኑ በእኛ ላይ እየተጫወተ ነው። በጣም ብዙ ጊዜ የፊደል ገበታ ዋናው ክፍል በእገዳው መጀመሪያ ላይ አይደለም (ለምሳሌ, የሩሲያ ዋና ከተማ "A" ኮድ አለው. 0x0410ምንም እንኳን የሲሪሊክ እገዳ የሚጀምረው በ 0x0400). ስለዚህ የመጀመሪያዎቹን 64 ቁምፊዎች ወደ ስታሽ ከወሰድን በኋላ የፊደል ጅራቱን ክፍል ልናጣ እንችላለን።

ይህንን ችግር ለመፍታት፣ ከተለያዩ ቋንቋዎች ጋር የሚዛመዱ አንዳንድ ብሎኮችን በእጄ አልፌያለሁ እና የረዳት ፊደላትን በዋናው ውስጥ ለእነሱ ገለጽኩላቸው። የላቲን ፊደል፣ እንደ ልዩ፣ በአጠቃላይ እንደ ቤዝ64 ተቀይሯል።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።

የመጨረሻ ንክኪዎች

በመጨረሻ ሌላ ነገር የት እንደምናሻሽል እናስብ።

ቅርጸቱን ልብ ይበሉ 101xxxxx xxxxxxxx xxxxxxxx ቁጥሮችን እስከ ኮድ እንዲያደርጉ ይፈቅድልዎታል 0x1FFFFF, እና ዩኒኮድ ቀደም ብሎ ያበቃል, በ 0x10FFFF. በሌላ አነጋገር, የመጨረሻው ኮድ ነጥብ እንደ ይወከላል 10110000 11111111 11111111. ስለዚህ, የመጀመሪያው ባይት ቅጹ ከሆነ ማለት እንችላለን 1011xxxx (የት xxxx ከ0 በላይ) ከዚያም ሌላ ማለት ነው። ለምሳሌ፣ በአንድ ባይት ውስጥ ለመቀየሪያ በቋሚነት የሚገኙ ሌሎች 15 ቁምፊዎችን እዚያ ማከል ትችላለህ፣ ግን በተለየ መንገድ ላደርገው ወሰንኩ።

አሁን ሶስት ባይት የሚያስፈልጋቸውን የዩኒኮድ ብሎኮች እንይ። በመሠረቱ ፣ ቀደም ሲል እንደተገለፀው ፣ እነዚህ የቻይንኛ ቁምፊዎች ናቸው - ግን ከእነሱ ጋር ማንኛውንም ነገር ማድረግ ከባድ ነው ፣ ከእነዚህ ውስጥ 21 ሺህ አሉ። ነገር ግን ሂራጋና እና ካታካና ወደዚያ በረሩ - እና ከአሁን በኋላ ያን ያህል ብዙ አይደሉም ከሁለት መቶ ያነሱ። እና ጃፓኖችን ስላስታወስን ፣ ስሜት ገላጭ አዶዎችም አሉ (በእርግጥ በዩኒኮድ ውስጥ በብዙ ቦታዎች ተበታትነዋል ፣ ግን ዋናዎቹ ብሎኮች በክልል ውስጥ ናቸው ። 0x1F300 - 0x1FBFF). አሁን ከበርካታ የኮድ ነጥቦች በአንድ ጊዜ የሚሰበሰቡ ኢሞጂዎች መኖራቸውን ካሰቡ (ለምሳሌ፣ ስሜት ገላጭ ምስል)ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን። እስከ 7 ኮዶችን ያቀፈ ነው!)፣ ከዚያ ለእያንዳንዱ ሶስት ባይት (7×3 = 21 ባይት ለአንድ አዶ ፣ ቅዠት) ማውጣት ሙሉ በሙሉ ነውር ይሆናል።

ስለዚህ፣ ከኢሞጂ፣ ሂራጋና እና ካታካና ጋር የሚዛመዱ ጥቂት የተመረጡ ክልሎችን እንመርጣለን፣ ወደ አንድ ቀጣይነት ያለው ዝርዝር እንለውጣቸዋለን እና ከሶስት ይልቅ እንደ ሁለት ባይት እንቆጥራቸዋለን።

1011xxxx xxxxxxxx

ምርጥ፡ ከላይ የተጠቀሰው ስሜት ገላጭ ምስልሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።, 7 ኮድ ነጥቦችን ያካተተ, በ UTF-8 ውስጥ 25 ባይት ይወስዳል, እና ወደ ውስጥ እንገባለን 14 (ለእያንዳንዱ ኮድ ነጥብ በትክክል ሁለት ባይት)። በነገራችን ላይ ሀብር (በአሮጌውም ሆነ በአዲሱ አርታኢ) ሊዋሃድ አልፈቀደም, ስለዚህ በምስል ማስገባት ነበረብኝ.

አንድ ተጨማሪ ችግር ለማስተካከል እንሞክር. እንደምናስታውሰው, መሠረታዊው ፊደል በመሠረቱ ነው ከፍተኛ 6 ቢትእኛ በአእምሯችን ውስጥ የምናስቀምጠው እና በእያንዳንዱ ቀጣይ የዲኮድ ምልክት ኮድ ላይ የምንጣበቅበት. በብሎክ ውስጥ ባሉ የቻይንኛ ፊደላት ውስጥ 0x4E00 - 0x9FFFይህ ትንሽ 0 ወይም 1 ነው. ይህ በጣም ምቹ አይደለም: በእነዚህ ሁለት እሴቶች መካከል ፊደላትን ያለማቋረጥ መቀየር ያስፈልገናል (ማለትም ሶስት ባይት ማውጣት). ነገር ግን በረዥሙ ሁነታ ላይ ከኮዱ እራሱ አጭር ሁነታን በመጠቀም ኮድ የምናስቀምጠውን የቁምፊዎች ብዛት መቀነስ እንደምንችል ልብ ይበሉ (ከላይ ከተገለጹት ዘዴዎች በኋላ ይህ 10240 ነው) - ከዚያ የሂሮግሊፍስ ክልል ወደ ይቀየራል. 0x2600 - 0x77FF, እና በዚህ ሁኔታ ፣ በዚህ አጠቃላይ ክልል ውስጥ ፣ በጣም አስፈላጊው 6 ቢት (ከ 21) ጋር እኩል ይሆናል 0. ስለዚህ ፣ የሂሮግሊፍስ ቅደም ተከተሎች በአንድ ሃይሮግሊፍ ሁለት ባይት ይጠቀማሉ (ለዚህ ትልቅ ክልል ተስማሚ ነው) ፣ ያለ የፊደል መቀየሪያዎችን መፍጠር.

አማራጭ መፍትሄዎች: SCSU, BOCU-1

የዩኒኮድ ባለሙያዎች የጽሁፉን ርዕስ ካነበቡ በኋላ በቀጥታ ከዩኒኮድ መመዘኛዎች መካከል እንዳለ ለማስታወስ ይቸኩላሉ ለዩኒኮድ መደበኛ የመጭመቂያ እቅድ (SCSU)፣ በአንቀጹ ውስጥ ከተገለጸው ጋር በጣም ተመሳሳይ የሆነ የመቀየሪያ ዘዴን የሚገልጽ።

በሐቀኝነት አልክድም: ስለ ሕልውናው የተማርኩት ውሳኔዬን በመጻፍ በጥልቅ ከተጠመቅኩ በኋላ ነው። ስለ ጉዳዩ ገና ከጅምሩ ባውቅ ኖሮ ምናልባት የራሴን አካሄድ ከመፍጠር ይልቅ ትግበራ ለመጻፍ እሞክር ነበር።

የሚገርመው ነገር SCSU እኔ በራሴ ካመጣኋቸው ሃሳቦች ጋር በጣም ተመሳሳይ የሆኑ ሃሳቦችን መጠቀሙ ነው (ከ"ፊደል" ጽንሰ ሃሳብ ይልቅ "መስኮቶችን" ይጠቀማሉ እና ከእነሱ የበለጠ ይገኛሉ)። በተመሳሳይ ጊዜ ይህ ቅርፀት እንዲሁ ጉዳቶች አሉት-ከማመቅያ ስልተ ቀመሮች ይልቅ ትንሽ ቅርብ ነው። በተለይም, መስፈርቱ ብዙ የውክልና ዘዴዎችን ይሰጣል, ነገር ግን በጣም ጥሩውን እንዴት እንደሚመርጥ አይናገርም - ለዚህ, ኢንኮደር አንዳንድ ዓይነት ሂውሪስቲክስ መጠቀም አለበት. ስለዚህ፣ ጥሩ ማሸጊያዎችን የሚያመርት የ SCSU ኢንኮደር ከእኔ ስልተ ቀመር የበለጠ ውስብስብ እና ከባድ ይሆናል።

ለማነፃፀር ፣ በአንጻራዊነት ቀላል የ SCSU ትግበራን ወደ ጃቫ ስክሪፕት አስተላልፌያለሁ - በኮድ ድምጽ መጠን ከእኔ UTF-C ጋር ሊወዳደር ችሏል ፣ ግን በአንዳንድ ሁኔታዎች ውጤቱ በአስር በመቶዎች የሚቆጠሩ የከፋ ነበር (አንዳንድ ጊዜ ሊበልጥ ይችላል ፣ ግን ብዙ አይደለም)። ለምሳሌ፣ የዕብራይስጥ እና የግሪክ ጽሑፎች በUTF-C የተመሰጠሩ ናቸው። ከ SCSU 60% የተሻለ (ምናልባትም በተጨናነቁ ፊደሎቻቸው ምክንያት ሊሆን ይችላል)።

በተናጥል ፣ ከ SCSU በተጨማሪ ዩኒኮድን ለመወከል ሌላ መንገድ እንዳለ እጨምራለሁ - BOCU-1ነገር ግን የ MIME ተኳኋኝነትን ያለመ ነው (የማያስፈልገኝ) እና ኢንኮዲንግ ለማድረግ ትንሽ ለየት ያለ አቀራረብ ይወስዳል። ውጤታማነቱን አልገመግምም, ግን ለእኔ ከ SCSU ከፍ ያለ ሊሆን የማይችል ይመስላል.

ሊሆኑ የሚችሉ ማሻሻያዎች

ያቀረብኩት አልጎሪዝም በንድፍ ሁለንተናዊ አይደለም (ይህ ምናልባት ግቦቼ ከዩኒኮድ ኮንሰርቲየም ግቦች በጣም የሚለያዩበት ነው)። ቀደም ብዬ የገለጽኩት በዋነኛነት የተዘጋጀው ለአንድ ተግባር ነው (ብዙ ቋንቋ ተናጋሪ መዝገበ ቃላትን በቅድመ ቅጥያ ዛፍ ውስጥ ማከማቸት) እና አንዳንድ ባህሪያቱ ለሌሎች ስራዎች ላይስማማ ይችላል። ነገር ግን ደረጃው አለመሆኑ ተጨማሪ ሊሆን ይችላል - ከፍላጎትዎ ጋር በሚስማማ መልኩ በቀላሉ ማስተካከል ይችላሉ።.

ለምሳሌ፣ ግልጽ በሆነ መንገድ የግዛት መኖርን ማስወገድ፣ ሀገር አልባ ኮድ ማድረግ ይችላሉ - ተለዋዋጮችን ብቻ አያዘምኑ። offs, auxOffs и is21Bit ኢንኮደር እና ዲኮደር ውስጥ. በዚህ ሁኔታ የአንድ ፊደል ቁምፊዎችን ቅደም ተከተል ውጤታማ በሆነ መንገድ ማሸግ አይቻልም, ነገር ግን ምንም እንኳን አውድ ምንም ይሁን ምን ተመሳሳይ ቁምፊ ሁልጊዜ በተመሳሳይ ባይት መያዙ ዋስትና ይኖረዋል.

በተጨማሪም ፣ ነባሪውን ሁኔታ በመቀየር ኢንኮደሩን ወደ አንድ የተወሰነ ቋንቋ ማበጀት ይችላሉ - ለምሳሌ ፣ በሩሲያ ጽሑፎች ላይ በማተኮር ፣ መጀመሪያ ላይ ኢንኮደር እና ዲኮደር ያዘጋጁ። offs = 0x0400 и auxOffs = 0. ይህ በተለይ አገር አልባ ሁነታን በተመለከተ ምክንያታዊ ነው. በአጠቃላይ, ይህ የድሮውን ስምንት-ቢት ኢንኮዲንግ ከመጠቀም ጋር ተመሳሳይ ይሆናል, ነገር ግን እንደ አስፈላጊነቱ ከሁሉም ዩኒኮድ ቁምፊዎችን የማስገባት ችሎታን ሳያስወግድ.

ቀደም ሲል የተጠቀሰው ሌላው መሰናክል በ UTF-C ውስጥ በተቀመጠው ትልቅ ጽሑፍ ውስጥ የዘፈቀደ ባይት ቅርብ የሆነውን የቁምፊ ድንበር ለማግኘት ፈጣን መንገድ የለም። የመጨረሻውን ከቆረጡ 100 ባይት ከተቀየረው ቋት ውስጥ በሉት ምንም ማድረግ የማትችሉትን ቆሻሻ ሊያገኙ ይችላሉ። ኢንኮዲንግ የባለብዙ ጊጋባይት ምዝግብ ማስታወሻዎችን ለማከማቸት የተነደፈ አይደለም, ነገር ግን በአጠቃላይ ይህ ሊስተካከል ይችላል. ባይት 0xBF እንደ መጀመሪያ ባይት በፍፁም መታየት የለበትም (ነገር ግን ሁለተኛው ወይም ሦስተኛው ሊሆን ይችላል)። ስለዚህ, ኢንኮዲንግ ሲያደርጉ, ቅደም ተከተሎችን ማስገባት ይችላሉ 0xBF 0xBF 0xBF እያንዳንዱ ፣ 10 ኪቢ ይበሉ - ከዚያ ፣ ድንበር መፈለግ ከፈለጉ ፣ ተመሳሳይ ምልክት እስኪገኝ ድረስ የተመረጠውን ቁራጭ መፈተሽ በቂ ነው። የመጨረሻውን ተከትሎ 0xBF የቁምፊ መጀመሪያ እንደሚሆን የተረጋገጠ ነው። (በመግለጽ ጊዜ፣ ይህ የሶስት ባይት ቅደም ተከተል፣ በእርግጥ፣ ችላ ማለት ያስፈልጋል።)

ለማጠቃለል

ይህን እስካሁን ካነበብክ፣ እንኳን ደስ ያለህ! እንደ እኔ ስለ ዩኒኮድ አወቃቀር አዲስ ነገር እንደተማርክ (ወይም የማስታወስ ችሎታህን እንደታደሰ) ተስፋ አደርጋለሁ።

ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።
የማሳያ ገጽ። የዕብራይስጥ ምሳሌ ከሁለቱም UTF-8 እና SCSU ያሉትን ጥቅሞች ያሳያል።

ከላይ የተገለፀው ጥናት ደረጃዎችን እንደ መጣስ ተደርጎ ሊወሰድ አይገባም። ሆኖም ግን, በአጠቃላይ በስራዬ ውጤት ረክቻለሁ, ስለዚህ በእነሱ ደስተኛ ነኝ ማጋራትለምሳሌ፣ አንድ አነስተኛ JS ቤተ-መጽሐፍት 1710 ባይት ብቻ ይመዝናል (እና ምንም ጥገኝነቶች የሉትም፣ በእርግጥ)። ከላይ እንደገለጽኩት ስራዋ የሚገኘው በ ማሳያ ገጽ (ከ UTF-8 እና SCSU ጋር ሊወዳደር የሚችልበት የጽሑፍ ስብስብም አለ)።

በመጨረሻም, UTF-C ጥቅም ላይ በሚውልባቸው ጉዳዮች ላይ እንደገና ትኩረት እሰጣለሁ ምንም ዋጋ የለውም:

  • መስመሮችዎ በቂ ርዝመት ካላቸው (ከ100-200 ቁምፊዎች)። በዚህ አጋጣሚ እንደ ዲፍሌት ያሉ የመጨመቂያ ስልተ ቀመሮችን ስለመጠቀም ማሰብ አለብዎት.
  • የሚያስፈልግህ ከሆነ ASCII ግልጽነት፣ ማለትም ፣ የተመሰጠሩት ቅደም ተከተሎች በዋናው ሕብረቁምፊ ውስጥ የሌሉ የ ASCII ኮዶችን አለመያዙ ለእርስዎ አስፈላጊ ነው። ከሶስተኛ ወገን ኤፒአይዎች ጋር ሲገናኙ (ለምሳሌ ከዳታቤዝ ጋር በመስራት) የኢኮዲንግ ውጤቱን እንደ ረቂቅ ባይት ስብስብ ካለፉ፣ እና እንደ ሕብረቁምፊዎች ካልሆነ ይህንን አስፈላጊነት ማስቀረት ይቻላል። አለበለዚያ ያልተጠበቁ ድክመቶች ሊያጋጥምዎት ይችላል.
  • በዘፈቀደ ማካካሻ (ለምሳሌ የመስመሩ ክፍል ሲጎዳ) የቁምፊ ድንበሮችን በፍጥነት ማግኘት ከፈለጉ። ይህንን ማድረግ ይቻላል, ነገር ግን ከመጀመሪያው መሾመር (ወይም በቀድሞው ክፍል ላይ የተገለጸውን ማሻሻያ በመተግበር) መስመሩን በመቃኘት ብቻ ነው.
  • በሕብረቁምፊዎች ይዘት ላይ ክዋኔዎችን በፍጥነት ማከናወን ከፈለጉ (መደርደር ፣ በውስጣቸው ንዑስ ሕብረቁምፊዎችን ይፈልጉ ፣ ያገናኙ)። ይህ ሕብረቁምፊዎች በመጀመሪያ ዲኮድ እንዲደረግ ይፈልጋል፣ ስለዚህ UTF-C በእነዚህ አጋጣሚዎች ከUTF-8 ቀርፋፋ ይሆናል (ግን ከመጭመቂያ ስልተ ቀመሮች የበለጠ ፈጣን)። ተመሳሳዩ ሕብረቁምፊ ሁልጊዜም በተመሳሳይ መንገድ የተመሰጠረ ስለሆነ፣ የዲኮዲንግ ትክክለኛ ንፅፅር አያስፈልግም እና በባይት ባይት መሠረት ሊከናወን ይችላል።

ዝማኔ: ተጠቃሚው። ቲዮሚች ከታች ባሉት አስተያየቶች ውስጥ የUTF-C ተፈጻሚነት ገደቦችን የሚያጎላ ግራፍ ለጥፏል። የታሸገው ሕብረቁምፊ አጭር እስከሆነ ድረስ UTF-C ከአጠቃላይ-ዓላማ መጭመቂያ ስልተ ቀመር (የ LZW ልዩነት) የበለጠ ቀልጣፋ መሆኑን ያሳያል። ~ 140 ቁምፊዎች (ነገር ግን ንጽጽሩ በአንድ ጽሑፍ ላይ መካሄዱን አስተውያለሁ፤ ለሌሎች ቋንቋዎች ውጤቱ ሊለያይ ይችላል።)
ሌላ ብስክሌት፡ ከ30-60% ከ UTF-8 የበለጠ የታመቁ የዩኒኮድ ገመዶችን እናከማቻለን።

ምንጭ: hab.com

አስተያየት ያክሉ