He pehea te ahua o Linux ki te whakariterite i nga aho

Whakataki

I timata katoa me te tuhinga poto e tika ana hei whakakotahi i nga korero korero email i whiwhi nga kaimahi mai i te rarangi o nga kaiwhakamahi rarangi mēra, me nga tuunga kaimahi i whiwhi mai i te paataka korero a te tari HR. Ko nga rarangi e rua i kaweake ki nga konae tuhinga Unicode UTF-8 ka tiakina ki nga mutunga raina Unix.

Ihirangi mail.txt

Иванов Андрей;[email protected]

Ihirangi buhg.txt

Иванова Алла;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Абаканов Михаил;маляр

Hei hanumi, i tohua nga konae ma te tono Unix ahua ka tukuna ki te whakaurunga o te kaupapa Unix uru, i rahua ohorere me te hapa:

$> sort buhg.txt > buhg.srt
$> sort mail.txt > mail.srt
$> join buhg.srt mail.srt > result
join: buhg.srt:4: is not sorted: Иванов Андрей;слесарь

Ma te tiro i te hua whakarōpūtanga me o kanohi i whakaatu mai, i te nuinga o te waa, he tika te tohatoha, engari ki te tupono o nga ingoa ingoa tane me nga wahine, ka puta nga wahine ki mua i nga tane:

$> sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванова Алла;маляр
Иванов Андрей;слесарь

He rite te ahua o te komaka i roto i te Unicode, he rite ranei ki te whakakitenga o te wahine i roto i te raupapa algorithm. Ko te tuatahi, ko te tikanga, he pai ake.

Me waiho e tatou mo tenei wa uru me te arotahi ki runga ahua. Me ngana ki te whakaoti rapanga ma te whakamahi i te poking pūtaiao. Tuatahi, me huri tatou i te waahi mai i en_US, i runga i ru_RU. Hei kōmaka, ka nui noa te tautuhi i te taurangi taiao LC_COLLATE, engari e kore matou e moumou taima ki nga mea iti:

$> LANG=ru_RU.UTF-8 sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванова Алла;маляр
Иванов Андрей;слесарь

Kaore he mea i huri.

Me ngana ki te tohu ano i nga konae ki te whakawaehere paita kotahi:

$> iconv -f UTF-8 -t KOI8-R buhg.txt 
 | LANG=ru_RU.KOI8-R sort 
 | iconv -f KOI8-R -t UTF8

Ano ano kaore he mea i rereke.

Kaore he mea ka taea e koe, me rapu koe mo te otinga i runga i te Ipurangi. Karekau he korero mo nga ingoa ingoa Ruhia, engari he patai mo etahi atu momo rerekee. Hei tauira, he raru tenei: Ko te momo unix e tohu ana i nga tohu '-' (pīhono) he kore e kitea. Hei poto, ko nga aho "a-b", "aa", "ac" ka tohua hei "aa", "a-b", "ac".

He paerewa te whakautu ki nga waahi katoa: whakamahia te waahi o te kaiwhakaputa "C" a ka koa koe. Kia tamata tatou:

$> LANG=C sort buhg.txt
Ёлкина Элла;крановщица
Абаканов Михаил;маляр
Иванов Андрей;слесарь
Иванова Алла;адвокат

Kua huri tetahi mea. Ko nga Ivanov i raupapa tika, ahakoa i paheke a Yolkina ki tetahi wahi. Kia hoki ki te raruraru taketake:

$> LANG=C sort buhg.txt > buhg.srt
$> LANG=C sort mail.txt > mail.srt
$> LANG=C join buhg.srt mail.srt > result

I mahi kaore he hapa, pera i ta te Ipurangi i oati. Na tenei ahakoa Yolkina i te rarangi tuatahi.

Te ahua nei kua whakatauhia te raru, engari mena he take, me whakamatau tetahi atu whakawaehere Russian - Windows CP1251:

$> iconv -f UTF-8 -t CP1251 buhg.txt 
 | LANG=ru_RU.CP1251 sort 
 | iconv -f CP1251 -t UTF8 

Ko te hua toka, he mea rerekee, ka rite ki te waahi "C", me te tauira katoa, na reira, ka rere kore he. Tetahi ahua o te mysticism.

Kare au i te pai ki nga mahi makutu i roto i te kaupapa na te mea ka huna e ia nga hapa. Me tino titiro tatou ki te mahi. ahua a he aha te paanga? LC_COLLATE .

Hei te mutunga ka ngana ahau ki te whakautu i nga patai:

  • he aha te take i he te whakaraupapa ingoa ingoa wahine?
  • he aha LANG=ru_RU.CP1251 ka puta he rite LANG=C
  • hei aha ahua и uru nga whakaaro rereke mo te raupapa o nga aho kua tohua
  • he aha i hapa ai oku tauira katoa?
  • ka mutu me pehea te whakariterite i nga aho ki to hiahia

Kōmaka ki te Waehereao

Ko te waahi tuatahi ko te ripoata hangarau Nama 10 e tika ana Unicode kohinga algorithm online unicode.org. He maha nga korero hangarau kei roto i te purongo, no reira ka hoatu e ahau he whakapoto poto mo nga whakaaro matua.

te whakaemitanga — Ko te "whakataurite" nga aho te putake o tetahi algorithm tohatoha. He rereke pea nga algorithms ("mirumiru", "hanumi", "tere"), engari ka whakamahia e ratou katoa he whakataurite o nga aho takirua hei whakatau i te raupapa o te putanga.

Ko te whakatakoto aho i roto i te reo maori he raruraru tino uaua. Ahakoa i roto i nga whakawaehere kotahi-paita ngawari, ko te raupapa o nga reta i roto i te reta, ahakoa he rereke te rereke mai i te reta Raina Ingarihi, ka kore e rite ki te raupapa o nga uara tau e whakawaeheretia ana enei reta. Na i roto i te reta Tiamana te reta Ö tu ana i waenganui О и P, me te whakawaehere CP850 ka riro ia i waenganui ÿ и Ü.

Ka taea e koe te ngana ki te tango mai i tetahi whakawaehere motuhake me te whakaaro ki nga reta "pai" kua whakaritea kia rite ki te mahi i roto i te Unicode. Whakawaehere UTF8, UTF16 paita-tahi ranei KOI8-R (mehemea ka hiahiatia he waahanga iti o te Waehereao) ka whakaatu i nga tohu tau rereke o nga reta, engari me titiro ki nga huānga o te ripanga turanga.

Te ahua nei ahakoa ka hangaia e tatou he teepu tohu mai i te wahanga, kare e taea e tatou te tautapa he raupapa tohu mo te ao. I roto i nga momo reta o te motu e whakamahi ana i nga reta kotahi, ka rereke pea te raupapa o enei reta. Hei tauira, i te reo Wīwī Æ ka kiia he here, ka tohua hei aho AE. I roto i te reo Norwegian Æ ka waiho he reta motuhake, kei muri Z. I te ara, i roto i te tua ki te here rite Æ He reta kua tuhia me te maha o nga tohu. Na kei roto i te reta a Czech he reta Ch, e tu ana i waenganui H и I.

I tua atu i nga rereketanga o nga reta, tera ano etahi atu tikanga o te motu e awe ana i te tohatoha. Ina koa, ka puta ake te patai: me pehea te raupapa o nga kupu e mau ana i nga reta matua me nga reta iti ki te papakupu? Ka paopao pea te whakatakotoranga ma te whakamahi i nga tohu tohu. I roto i te reo Paniora, ka whakamahia he tohu patai i te timatanga o te rerenga patai (He pai ki a koe te puoro?). I roto i tenei take, ka kitea e kore e tika kia whakarōpūhia nga rerenga patai ki tetahi kahui motuhake i waho o te reta, engari me pehea te whakariterite i nga rarangi me etahi atu tohu tohu?

E kore ahau e noho ki te tohatoha aho i roto i nga reo rereke rawa atu i nga reo Pakeha. Kia mahara kei roto i nga reo me te taha matau-ki-maui, runga-ki-raro ranei te tuhi tuhi, ko nga tohu kei roto i nga rarangi ka rongoa i roto i te raupapa panui, tae atu ki nga punaha tuhi-kore-a-ara kei a raatau ake huarahi ki te raupapa rarangi tohu ma te ahua. . Hei tauira, ka taea te ota i te ahua o te ahua (Nga taviri tohu Hainamana) ma te whakahua ranei. Ma te pono, kaore au i te mohio me pehea te whakarite emojis, engari ka taea e koe te whakaaro mo ratou ano.

I runga i nga ahuatanga kua whakarārangihia i runga ake nei, ko nga whakaritenga taketake mo te whakatairite aho i runga i nga ripanga Unicode i hangaia:

  • Ko te whakataurite o nga aho kaore e whakawhirinaki ki te waahi o nga tohu i te ripanga waehere;
  • Ko nga raupapa o nga tohu e hanga ana i te ahua kotahi ka whakahekehia ki te ahua kano (A + ko te porowhita o runga he rite ki Å);
  • I te whakatairite i nga aho, ka whakaarohia tetahi ahua i roto i te horopaki o te aho, a, ki te tika, ka honoa me ona hoa tata ki tetahi waahanga whakataurite (Ch i Czech) kua wehea ranei ki etahi (Æ i te reo Wīwī);
  • Me whirihora nga ahuatanga o te motu katoa (alphabet, pūmatua/pūriki, tohu tohu, raupapa momo tuhi) tae noa ki te taumahi a-ringa o te ota (emoji);
  • He mea nui te whakatairite ehara mo te tohatoha noa, engari ki etahi atu waahi, hei tauira mo te whakatau i nga awhe haupae (whakakapi i te {A... z} Tuhinga);
  • kia tere te whakarite.

I tua atu, i hangaia e nga kaituhi o te ripoata nga ahuatanga whakatairite kia kaua e whakawhirinaki nga kaiwhakawhanake algorithm:

  • Ko te whakataurite algorithm kaua e tono he huinga tohu motuhake mo ia reo (Ko nga reo Ruhia me Iukereiniana te nuinga o nga tohu Cyrillic);
  • kia kaua e whakawhirinaki te whakataurite ki te raupapa o nga tohu i roto i nga ripanga Waehereao;
  • Ko te taumaha o te aho kia kaua e waiho hei huanga o te aho, i te mea he rereke nga taumahatanga o te aho kotahi i roto i nga horopaki ahurea rereke;
  • Ka huri nga taumaha rarangi ina hanumi, ka wehea ranei (mai x < y e kore e whai i tera xz < yz);
  • Ko nga aho rereke he rite nga taumahatanga ka kiia he rite mai i te tirohanga o te algorithm tohatoha. Ka taea te whakauru i etahi atu raupapa o nga aho, engari ka heke te mahi;
  • I roto i te whakarōpūtanga tukurua, ka taea te huri i nga rarangi he rite nga taumahatanga. Ko te pakari he taonga o tetahi algorithm tohatoha motuhake, ehara i te taonga o te algorithm whakatairite aho (tirohia te waahanga o mua);
  • Ka huri pea nga ture whakarōpū i te wa ka huri te tikanga tuku iho.

Ka whakatauhia ano ko te algorithm whakatairite kaore e mohio ki nga ahuatanga o nga aho e mahia ana. No reira, ko nga aho e mau ana i nga mati anake kaua e whakatauritea hei tau, a kei roto i nga rarangi ingoa Ingarihi te tuhinga (Beatles, Te).

Hei whakaea i enei whakaritenga katoa, ka tukuna he taumata-maha (e wha-taumata) te whakariterite i te ripanga algorithm.

I mua, ka whakahekehia nga tohu o te aho ki te ahua kano ka whakarōpūhia ki nga waeine whakataurite. Ka whakawhiwhia ki ia waeine whakatairite he maha nga taumahatanga e rite ana ki nga taumata maha o te whakataurite. Ko nga taumahatanga o nga waeine whakatairite he huānga o nga huinga raupapa (i tenei keehi, tauoti) ka taea te whakataurite mo te nui ake, iti iho ranei. Te tikanga motuhake KAUPAPA Ko te tikanga (0x0) kei te taumata whakatairite e rite ana kaore tenei waahanga e uru ki te whakataurite. Ko te whakataurite o nga aho ka taea te tukurua i nga wa maha, ma te whakamahi i nga taumaha o nga taumata e rite ana. I ia taumata, ka whakatairitea nga taumaha o nga waeine whakatairite o nga rarangi e rua ki a raatau ano.

I roto i nga whakatinanatanga rereke o te algorithm mo nga tikanga rereke o te motu, ka rereke pea nga uara o nga whakarea, engari kei roto i te paerewa Unicode he ripanga taumaha - "Ripanga Huānga Whakaemi Waehereao Taunoa" (DUCET). E hiahia ana ahau ki te tuhi i te tautuhi i te taurangi LC_COLLATE he tino tohu mo te kowhiringa o te ripanga taumaha i roto i te mahi whakatairite aho.

Taumaha taumaha DUCET kua whakaritea e whai ake nei:

  • i te taumata tuatahi, ka whakahekehia nga reta katoa ki te keehi kotahi, ka makahia nga tohu korero, ka warewarehia nga tohu tohu (kaore i te katoa);
  • i te reanga tuarua, ko nga korero korero anake ka whakaarohia;
  • i te taumata tuatoru, ko te keehi anake ka whakaarohia;
  • i te taumata tuawha, ko nga tohu tohutoro anake ka whakaarohia.

Ko te whakataurite ka puta i roto i te maha o nga paahitanga: tuatahi, ka whakatauritehia nga taurangi o te taumata tuatahi; ki te taurite nga pauna, katahi ka mahia he whakataurite ki nga taumahatanga taumata tuarua; katahi pea te tuatoru me te tuawha.

Ka mutu te whakatairite ina kei roto i nga rarangi nga waeine taurite ki nga taumahatanga rereke. Ko nga rarangi e rite ana nga taumahatanga ki nga taumata e wha ka kiia he rite tetahi ki tetahi.

Ko tenei algorithm (me etahi atu korero hangarau) i hoatu te ingoa ki te ripoata Nama 10 - "Hatepehanga Kohinga Waehereao" (ACU).

Koinei te waahi ka marama ake te ahua o te ahua o to maatau tauira. He pai ki te whakataurite ki te paerewa Unicode.

Hei whakamatautau i nga whakatinanatanga ACU he mea motuhake pātaitai, te whakamahi kōnae taumaha, te whakatinana DUCET. Ka kitea e koe nga momo mea rorirori katoa i roto i te konae unahi. Hei tauira, kei reira te raupapa o te mahjong me nga dominoes Pakeha, me te raupapa o nga hutu i roto i te rahora o nga kaari (tohu 1F000 me etahi atu). Ka whakanohohia nga hutu kaari i runga i nga ture o te piriti - PCBT, ko nga kaari kei roto i te hutu kei te raupapa T, 2,3, XNUMX... K.

Te taki ā-ringa kei te kōmaka tika ngā haupae e ai ki DUCET he tino hoha, engari, he waimarie ki a matou, he tauira pai te whakatinanatanga o te whare pukapuka mo te mahi me te Unicode - "Waehere Ao mo te Waehereao"((ICU).

I te paetukutuku o tenei whare pukapuka, i whakawhanakehia i roto i IBM, kei reira nga wharangi demo, tae atu ki wharangi algorithm whakatairite aho. Ka uru matou ki o maatau rarangi whakamatautau me nga tautuhinga taunoa, a, na, ka whiwhi matou i te raupapa Russian tino tika.

Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Иванова Алла;адвокат

Ma te ara, i runga i te paetukutuku ICU Ka kitea e koe he whakamaarama o te algorithm whakatairite i te wa e tukatuka ana i nga tohu tohu. I roto i nga tauira Kohikohi FAQ karekau e arohia te apostrophe me te tohuhono.

I awhina a Unicode i a maatau, engari me rapu nga take mo te whanonga ke ahua в Linux me haere ki tetahi atu wahi.

Kōmaka i roto i te glibc

Tiro tere mo nga waehere puna whaipainga ahua Tuhinga ka whai mai Nga taputapu matua GNU i whakaatu i roto i te whaipainga ake, ka heke te waahi ki te ta i te uara o naianei o te taurangi LC_COLLATE ina rere ana i te aratau patuiro:

$ sort --debug buhg.txt > buhg.srt
sort: using ‘en_US.UTF8’ sorting rules

Ka mahia nga whakataurite aho ma te whakamahi i te mahi paerewa strcoll, ko te tikanga ko nga mea whakamere kei roto i te whare pukapuka glibc.

I roto i te wiki te kaupapa glibc whakatapua ki te whakataurite aho kotahi kōwae. Mai i tenei waahanga ka taea te mohio kei roto glibc Ko te whakariterite i runga i te algorithm kua mohiotia e matou ACU (Ko te Unicode kohinga algorithm) me/ranei i te paerewa tata ki tera ISO 14651 (Te raupapa aho o te ao me te whakataurite). Mo te paerewa hou, me tohu kei runga i te waahi standards.iso.org ISO 14651 i whakapuakina mana e waatea ana ki te iwi whanui, engari ko te hono e tika ana ka ahu atu ki tetahi wharangi kore. He maha nga wharangi ka whakahokia mai e Google me nga hononga ki nga waahi whaimana e tuku ana ki te hoko kape hiko o te paerewa mo te kotahi rau euros, engari kei te wharangi tuatoru, tuawha ranei o nga hua rapu he hononga tika ano ki PDF. I te nuinga o te waa, kaore i rereke te paerewa ACU, engari he hoha ki te panui na te mea karekau he tauira maamaa o nga ahuatanga o te motu mo te tohatoha aho.

Ko nga korero tino pai mo wiki he hononga ki kaiwhai bug me te korerorero mo te whakatinanatanga o te whakataurite aho i roto glibc. Mai i nga korero ka taea te ako mai glibc whakamahia hei whakatairite i nga aho ISOtepu whaiaro Te Ripanga Tauira Taunoa (CTT), ka kitea te wahitau o te tono A paerewa ISO 14651. I waenganui i te tau 2000 me te tau 2015 kei roto tenei tepu glibc karekau he kai tiaki, he tino rereke (he iti rawa ki waho) mai i te putanga o naianei o te paerewa. Mai i te tau 2015 ki te 2018, i puta te urutaunga ki te putanga hou o te teepu, a inaianei ka whai waahi koe ki te tutaki i roto i te ao tuuturu he putanga hou o te tepu (CentOS 8), me te tawhito (CentOS 7).

Inaianei kei a maatau nga korero katoa mo te algorithm me nga ripanga awhina, ka taea e tatou te hoki ki te raru taketake me te mohio ki te tika te whakariterite i nga aho i roto i te rohe o Ruhia.

ISO 14651 / 14652

Waehere puna o te tepu e aro atu ana matou CTT i runga i te nuinga o nga tohatoha Linux kei roto i te pukapuka /usr/share/i18n/locales/. Ko te ripanga ake kei roto i te konae iso14651_t1_noa. Na ko te tohutohu kōnae tenei tārua iso14651_t1_common kei roto i te konae iso14651_t1, ka uru ki roto i nga konae a motu, tae atu ki en_US, и ru_RU. I te nuinga o nga tohatoha Linux Ko nga konae puna katoa kua whakauruhia ki roto i te whakaurunga taketake, engari mena karekau, me whakauru e koe he kete taapiri mai i te tohatoha.

Hanganga kōnae iso14651_t1 he ahua tino korero, me nga ture kore-marama mo te hanga ingoa, engari ki te titiro koe, he maamaa noa nga mea katoa. Ko te hanganga e whakaahuahia ana i te paerewa ISO 14652, he kape ka taea te tango mai i te paetukutuku tuwhera-std.org. Ko tetahi atu whakaahuatanga mo te whakatakotoranga konae ka taea te panui ki roto whakaritenga POSIX i OpenGroup. Hei rereke ki te panui i te paerewa, ka taea e koe te ako i te waehere puna o te mahi kohikohi_panui в glibc/locale/programs/ld-collate.c.

He penei te ahua o te hanganga kōnae:

Ma te taunoa, ka whakamahia te kiripuaki hei ahua mawhiti, a ko te mutunga o te raina i muri i te tohu # he korero. Ka taea te tautuhi ano i nga tohu e rua, koinei te mahi i roto i te putanga hou o te ripanga:

escape_char /
comment_char %

Kei te konae nga tohu kei te whakatakotoranga ranei (Kei hea x - mati hautekaumāono). Koinei te tohu hautekauono o nga tohu Waehereao i roto i te whakawaehere UCS-4 (UTF-32). Ko etahi atu huānga katoa kei roto i nga taiapa koki (tae atu ki te , <2> me nga mea pera) ka kiia ko nga taumau aho ngawari he iti te tikanga o waho o te horopaki.

Raina LC_COLLATE ka korero mai ka timata te raraunga e whakaatu ana i te whakataurite o nga aho.

Tuatahi, ka tohua nga ingoa mo nga taumahatanga i te ripanga whakataurite me nga ingoa mo nga huinga tohu. Ko te tikanga, ko nga momo ingoa e rua no nga hinonga rereke e rua, engari i roto i te konae tuuturu ka konatunatua. Ko nga ingoa o nga taumaha kua tohua e te kupu matua kohi-tohu (puāhua whakatairite) na te mea ka whakatairitehia, ko nga tohu Unicode he rite nga taumahatanga ka kiia he riterite.

Ko te tapeke roa o te wahanga i te whakahounga konae o naianei he 900 rarangi. I tangohia e au etahi tauira mai i nga waahi maha hei whakaatu i te ahua o nga ingoa me etahi momo wetereo.

LC_COLLATE

collating-symbol <RES-1>
collating-symbol <BLK>
collating-symbol <MIN>
collating-symbol <WIDE>
...
collating-symbol <ARABIC>
collating-symbol <ETHPC>
collating-symbol <OSMANYA>
...
collating-symbol <S1D000>..<S1D35F>
collating-symbol <SFFFF> % Guaranteed largest symbol value. Keep at end of this list
...
collating-element <U0413_0301> from "<U0413><U0301>"
collating-element <U0413_0341> from "<U0413><U0341>"

  • tohu-kotahi ka tuhia he aho OSMANYA kei te tepu ingoa o nga unahi
  • kohi-tohu .. ka rehita i te raupapa o nga ingoa kei roto i te prefix S me te kumuri tau hauono mai 1D000 ki 1D35F.
  • Whakauru в kohi-tohu he rite te ahua o te tauoti nui kore haina i roto i te hautekauono, engari he ingoa noa pea te ahua
  • имя te tikanga tohu tohu i roto i te whakawaehere UCS-4
  • kohi-huānga mai i "" ka rehita ingoa hou mo nga ira Unicode takirua.

Ina tautuhia nga ingoa o nga taumahatanga, ka tohua nga taumahatanga tuturu. I te mea ko nga hononga nui atu i te iti te mea nui ki te whakatairite, ka whakatauhia nga taumahatanga ma te raupapa ngawari o nga ingoa rarangi ingoa. Ko nga taumahatanga "mama" ka tohua i te tuatahi, katahi ka "taimaha". Me whakamahara ahau ki a koe ko ia tohu Unicode kua tohua kia wha nga taumahatanga rereke. I konei ka whakakotahihia ki te raupapa raupapa kotahi. I roto i te ariā, ka taea te whakamahi i tetahi ingoa tohu ki tetahi o nga taumata e wha, engari ko nga korero e tohu ana ka wehe a hinengaro nga kaihanga i nga ingoa ki nga taumata.

% Symbolic weight assignments

% Third-level weight assignments
<RES-1>
<BLK>
<MIN>
<WIDE>
...
% Second-level weight assignments
<BASE>
<LOWLINE> % COMBINING LOW LINE
<PSILI> % COMBINING COMMA ABOVE
<DASIA> % COMBINING REVERSED COMMA ABOVE
...
% First-level weight assignments
<S0009> % HORIZONTAL TABULATION 
<S000A> % LINE FEED
<S000B> % VERTICAL TABULATION
...
<S0434> % CYRILLIC SMALL LETTER DE
<S0501> % CYRILLIC SMALL LETTER KOMI DE
<S0452> % CYRILLIC SMALL LETTER DJE
<S0503> % CYRILLIC SMALL LETTER KOMI DJE
<S0453> % CYRILLIC SMALL LETTER GJE
<S0499> % CYRILLIC SMALL LETTER ZE WITH DESCENDER
<S0435> % CYRILLIC SMALL LETTER IE
<S04D7> % CYRILLIC SMALL LETTER IE WITH BREVE
<S0454> % CYRILLIC SMALL LETTER UKRAINIAN IE
<S0436> % CYRILLIC SMALL LETTER ZHE

Ka mutu, ko te tepu taumaha tonu.

Ko te waahanga taumaha kei roto i nga rarangi kupu matua ota_timata и ota_mutunga. Kōwhiringa taapiri ota_timata whakatauhia ko tehea aronga rarangi e karapahia ana i ia taumata whakatairite. Ko te tautuhinga taunoa ko Tuhinga o mua. Ko te tinana o te waahanga he rarangi kei roto te tohu tohu me ona taumaha e wha. Ko te tohu tohu ka taea te whakaatu e te ahua ake, he tohu tohu, he ingoa tohu ranei kua tautuhia i mua. Ka taea hoki te hoatu taumaha ki nga ingoa tohu, tohu tohu, ki nga tohu ranei. Mēnā ka whakamahia ngā tohu tohu, pūāhua rānei, he ōrite te taumaha ki te uara tau o te tohu tohu (tūnga kei te ripanga Unicode). Ko nga tohu karekau i whakaingoatia (e mohio ana ahau) ka tohua ki te ripanga me te taumaha tuatahi e rite ana ki te tuunga o te ripanga Unicode. Uara taumaha motuhake Tuhinga ko te tikanga ka warewarehia te tohu i te taumata whakataurite e tika ana.

Hei whakaatu i te hanganga o nga unahi, i whiriwhiria e ahau nga wahanga e toru e tino kitea ana:

  • ngā pūāhua karekau e arohia
  • tohu e rite ana ki te nama toru i nga taumata tuatahi e rua
  • te timatanga o te reta a Cyrillic, karekau he tuhi tuhi, no reira ka whakarōpūhia ma te taumata tuatahi me te tuatoru.

order_start forward;forward;forward;forward,position
<U0000> IGNORE;IGNORE;IGNORE;IGNORE % NULL (in 6429)
<U0001> IGNORE;IGNORE;IGNORE;IGNORE % START OF HEADING (in 6429)
<U0002> IGNORE;IGNORE;IGNORE;IGNORE % START OF TEXT (in 6429)
...
<U0033> <S0033>;<BASE>;<MIN>;<U0033> % DIGIT THREE
<UFF13> <S0033>;<BASE>;<WIDE>;<UFF13> % FULLWIDTH DIGIT THREE
<U2476> <S0033>;<BASE>;<COMPAT>;<U2476> % PARENTHESIZED DIGIT THREE
<U248A> <S0033>;<BASE>;<COMPAT>;<U248A> % DIGIT THREE FULL STOP
<U1D7D1> <S0033>;<BASE>;<FONT>;<U1D7D1> % MATHEMATICAL BOLD DIGIT THREE
...
<U0430> <S0430>;<BASE>;<MIN>;<U0430> % CYRILLIC SMALL LETTER A
<U0410> <S0430>;<BASE>;<CAP>;<U0410> % CYRILLIC CAPITAL LETTER A
<U04D1> <S04D1>;<BASE>;<MIN>;<U04D1> % CYRILLIC SMALL LETTER A WITH BREVE
<U0430_0306> <S04D1>;<BASE>;<MIN>;<U04D1> % CYRILLIC SMALL LETTER A WITH BREVE
...
<U0431> <S0431>;<BASE>;<MIN>;<U0431> % CYRILLIC SMALL LETTER BE
<U0411> <S0431>;<BASE>;<CAP>;<U0411> % CYRILLIC CAPITAL LETTER BE
<U0432> <S0432>;<BASE>;<MIN>;<U0432> % CYRILLIC SMALL LETTER VE
<U0412> <S0432>;<BASE>;<CAP>;<U0412> % CYRILLIC CAPITAL LETTER VE
...
order_end

Inaianei ka taea e koe te hoki ki te whakariterite i nga tauira mai i te timatanga o te tuhinga. Ko te pehipehi kei tenei wahanga o te ripanga taumaha:

<U0020> IGNORE;IGNORE;IGNORE;<U0020> % SPACE
<U0021> IGNORE;IGNORE;IGNORE;<U0021> % EXCLAMATION MARK
<U0022> IGNORE;IGNORE;IGNORE;<U0022> % QUOTATION MARK
...

Ka kitea kei roto i tenei ripanga nga tohu tohu mai i te ripanga Ascii (tae atu ki te mokowā) tata kore e arohia ina whakatairitehia nga aho. Ko nga mea rereke ko nga rarangi e rite ana ki nga mea katoa engari ko nga tohu tohu ka kitea i roto i nga waahi rite. Ko nga rarangi mai i taku tauira (i muri i te tohatoha) mo te whakataurite algorithm he penei te ahua:

АбакановМихаилмаляр
ЁлкинаЭллакрановщица
ИвановаАлламаляр
ИвановАндрейслесарь

Ki te whakaaro kei roto i te ripanga o nga pauna, ko nga reta matua i te reo Ruhia ka whai muri i nga reta iti (i te taumata tuatoru taumaha atu i ), he tino tika te ahua o te tohatoha.

I te wa e whakatakoto ana i te taurangi LC_COLLATE=C ka utaina he ripanga motuhake e tohu ana i te whakataurite paita-paita

static const uint32_t collseqwc[] =
{
  8, 1, 8, 0x0, 0xff,
  /* 1st-level table */
  6 * sizeof (uint32_t),
  /* 2nd-level table */
  7 * sizeof (uint32_t),
  /* 3rd-level table */
  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',
  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',

...
  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'xfe', L'xff'
};

I te mea kei te Waehereao te tohu tohu Ё kei mua i te A, ka tohua nga aho kia rite.

Kuputuhi me nga ripanga rua

Ko te tikanga, he mahi tino noa te whakatairite aho, me te poroporo ripanga CTT he tukanga utu nui. Hei arotau i te uru ki te ripanga, ka whakahiatohia ki te ahua rua me te whakahau localdef.

rōpū localdef ka whakaae hei tawhā i te konae me te ripanga o nga ahuatanga o te motu (kowhiringa -i), kei reira nga tohu katoa e tohuhia ana e nga ira Unicode, me tetahi konae reta i waenga i nga ira Waehereao me nga tohu o tetahi whakawaehere motuhake (kowhiringa -f). Ko te hua o te mahi, ka hangaia nga konae-rua mo te waahi me te ingoa kua tohua ki te tawhā whakamutunga.

glibc e tautoko ana i nga whakatakotoranga konae rua: "tuku iho" me te "hou".

Ko te tikanga o te whakatakotoranga tuku iho ko te ingoa o te waahi ko te ingoa o te raarangiroto kei roto /usr/lib/locale/. Ko tenei whaiaronga-roto e pupuri ana i nga konae-rua LC_COLLATE, LC_CTYPE, LC_TIME me etahi atu. Kōnae LC_IDENTIFICATION kei roto te ingoa ōkawa o te rohe (he rereke pea i te ingoa whaiaronga) me nga korero.

Ko te whakatakotoranga hou ko te penapena i nga waahi katoa ki te puranga kotahi /usr/lib/locale/locale-archive, ka mapi ki te mahara mariko o nga tukanga katoa e whakamahi ana glibc. Ko te ingoa rohe i roto i te whakatakotoranga hou kei raro i etahi tikanga - ko nga nama me nga reta kua whakahekehia ki te pu iti kei roto i nga ingoa whakawaehere. Na ru_RU.KOI8-R, ka ora hei ru_RU.koi8r.

Ka rapua nga konae whakauru i roto i te raarangi o naianei, me nga raarangi /usr/share/i18n/locales/ и /usr/share/i18n/charmaps/ mo nga kōnae CTT me nga konae whakawaehere.

Hei tauira, ko te whakahau

localedef -i ru_RU -f MAC-CYRILLIC ru_RU.MAC-CYRILLIC

ka whakahiato te konae /usr/share/i18n/locales/ru_RU te whakamahi i te konae whakawaehere /usr/share/i18n/charmaps/MAC-CYRILLIC.gz ka tiakina te hua ki roto /usr/lib/locale/locale-archive i raro i te ingoa ru_RU.maccyrillic

Mena ka tautuhia e koe te taurangi LANG = en_US.UTF-8 ka glibc ka titiro mo nga waahi-rua i roto i te raupapa o nga konae me nga raarangi e whai ake nei:

/usr/lib/locale/locale-archive
/usr/lib/locale/en_US.UTF-8/
/usr/lib/locale/en_US/
/usr/lib/locale/enUTF-8/
/usr/lib/locale/en/

Mena ka puta he waahi i roto i nga whakatakotoranga tuku iho me nga ahuatanga hou, katahi ka aro nui ki te waa hou.

Ka taea e koe te tiro i te rarangi o nga waahi kua whakahiato me te whakahau rohe-a.

Te whakarite i to ripanga whakataurite

Inaianei, ma te mohio, ka taea e koe te hanga i a koe ake tepu whakataurite aho. Me whakataurite tika tenei ripanga i nga reta a Ruhia, tae atu ki te reta Ё, me te whakaaro ano ki nga tohu tohu i runga i te ripanga. Ascii.

Ko te tukanga o te whakareri i to ake ripanga whakariterite e rua nga waahanga: te whakatika i te ripanga taumaha me te whakahiato ki te ahua rua me te whakahau localdef.

Kia whakatikaia ai te ripanga whakataurite me te iti o nga utu whakatika, i te whakatakotoranga ISO 14652 Ka whakaratohia nga waahanga mo te whakatikatika i nga taumaha o te teepu o naianei. Ka timata te waahanga ki te kupu matua whakaraupapa-muri me te tohu i te waahi ka oti te whakakapi. Ka mutu te wahanga ki te raina whakaraupapa-whakamutunga. Mena e tika ana kia whakatikahia etahi waahanga o te tepu, katahi ka hangaia he waahanga mo ia waahanga pera.

I tāruatia e au ngā putanga hōu o ngā kōnae iso14651_t1_noa и ru_RU mai i te putunga glibc ki taku whaiaronga whare ~/.local/share/i18n/locales/ me te whakatika paku te waahanga LC_COLLATE в ru_RU. Ko nga putanga hou o nga konae he tino hototahi ki taku putanga glibc. Mena kei te hiahia koe ki te whakamahi i nga putanga tawhito o nga konae, me whakarereke e koe nga ingoa tohu me te waahi ka tiimata te whakakapi i te ripanga.

LC_COLLATE
% Copy the template from ISO/IEC 14651
copy "iso14651_t1"
reorder-after <U000D>
<U0020> <S0020>;<BASE>;<MIN>;<U0020> % SPACE
<U0021> <S0021>;<BASE>;<MIN>;<U0021> % EXCLAMATION MARK
<U0022> <S0022>;<BASE>;<MIN>;<U0022> % QUOTATION MARK
...
<U007D> <S007D>;<BASE>;<MIN>;<U007D> % RIGHT CURLY BRACKET
<U007E> <S007E>;<BASE>;<MIN>;<U007E> % TILDE
reorder-end
END LC_COLLATE

Ko te mea pono, me whakarereke nga mara ki roto LC_IDENTIFICATION kia tohu ratou ki te rohe ru_MY, engari i roto i taku tauira kaore tenei i hiahiatia, na te mea i whakakorehia e ahau te puranga mai i te rapu mo nga waahi pūranga-rohe.

e localdef i mahi me nga konae i taku kōpaki ma te taurangi I18NPATH Ka taea e koe te taapiri i tetahi atu raarangi hei rapu i nga konae whakaurunga, a ko te raarangi hei tiaki i nga konae takirua ka taea te tohu hei ara whai riipene:

$> I18NPATH=~/.local/share/i18n localedef -i ru_RU -f UTF-8 ~/.local/lib/locale/ru_MY.UTF-8

POSIX whakaaro kei roto TE REO Ka taea e koe te tuhi i nga ara tino ki nga raarangi me nga konae rohe, ka tiimata me te rītaha whakamua, engari glibc в Linux kua tatauhia nga ara katoa mai i te whaiaronga turanga, ka taea te whakakore ma te taurangi LOCPATH. I muri i te whakaurunga LOCPATH=~/.local/lib/locale/ Ko nga konae katoa e pa ana ki te waahi ka rapua i taku kōpaki anake. Pūranga o nga waahi me te huinga taurangi LOCPATH kare i arohia.

Anei te whakamatautau whakatau:

$> LANG=ru_MY.UTF-8 LOCPATH=~/.local/lib/locale/ sort buhg.txt
Абаканов Михаил;маляр
Ёлкина Элла;крановщица
Иванов Андрей;слесарь
Иванова Алла;адвокат

Hore! I mahia e matou!

Mahi i runga i te tahua

Kua whakautua e au nga patai mo te tohatoha aho i te timatanga, engari he ruarua tonu nga patai mo nga hapa - ka kitea me te kore e kitea.

Kia hoki ki te raruraru taketake.

Me te kaupapa ahua me te hōtaka uru whakamahia nga mahi whakatairite aho mai i glibc. Nahea te reira i tupu ai uru hoatu he hapa kōmaka i runga i nga rarangi kua tohua e te whakahau ahua i roto i te rohe en_US.UTF-8? He ngawari te whakautu: ahua ka whakatairite i te aho katoa, a uru ka whakatairite i te ki anake, na te taunoa ko te timatanga o te aho tae noa ki te tohu mokowāma tuatahi. I roto i taku tauira, i puta he karere hapa na te mea kaore i rite te tohatoha o nga kupu tuatahi i roto i nga rarangi ki te tohatoha o nga rarangi katoa.

rohe "C" Ka whakamanahia i roto i nga aho kua kōmakahia ka kōmakatia hoki nga aho iti tuatahi tae noa ki te mokowā tuatahi, engari ka huna noa tenei i te hapa. Ka taea te kowhiri i nga raraunga (nga tangata he rite nga ingoa ingoa, engari he rereke nga ingoa tuatahi) ka kore he karere hapa, ka puta he hua hanumi konae. Ki te hiahia tatou uru kua hanumihia nga rarangi konae ma te ingoa katoa, katahi ko te huarahi tika ko te whakawhāiti i te kaiwehe mara me te whakariterite ma te mara matua, kaua ma te raina katoa. I tenei take, ka tika te haere o te hanumi, karekau he hapa i tetahi waahi:

$> sort -t ; -k 1 buhg.txt > buhg.srt
$> sort -t ; -k 1 mail.txt > mail.srt
$> join -t ; buhg.srt mail.srt > result

I momoho te mahi tauira i roto i te whakawaehere CP1251 kei roto tetahi atu hapa. Ko te meka kei roto i nga tohatoha katoa e mohiotia ana e au Linux kei te ngaro te waahi kua whakahiatohia ru_RU.CP1251. Mena kaore i kitea te waahi kua whakahiatohia, na ahua ka whakamahi wahangu i te whakatairite paita-paita, koinei ta matou i kite ai.

Ma te ara, tera ano tetahi raru iti e pa ana ki te kore e uru atu ki nga waahi kua whakahiato. Kapa LOCPATH=/tmp rohe -a ka hoatu he rarangi o nga waahi katoa kei roto pūranga-rohe, engari me te huinga taurangi LOCPATH mo nga kaupapa katoa (tae atu ki te nuinga rohe) karekau enei waahi e waatea mai.

$> LOCPATH=/tmp locale -a | grep en_US
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8

$> LC_COLLATE=en_US.UTF-8 sort --debug
sort: using ‘en_US.UTF-8’ sorting rules

$> LOCPATH=/tmp LC_COLLATE=en_US.UTF-8 sort --debug
sort: using simple byte comparison

mutunga

Mēnā he kaihātepe koe kua waia ki te whakaaro he huinga paita nga aho, ko to whiringa LC_COLLATE=C.

Mena he tohunga reo koe, he kaiwhakaiti papakupu ranei, he pai ake te whakahiato i to rohe.

Mena he kaiwhakamahi ngawari koe, na me mohio noa koe ki te whakahau ls -a ka whakaputa i nga konae ka tiimata me te ira kua konatunatua ki nga konae ka timata ki te reta, a Kaitohu o waenganui po, e whakamahi ana i ana mahi o roto ki te whakariterite i nga ingoa, ka whakatakoto i nga konae ka timata ki te ira i te timatanga o te rarangi.

tohutoro

Pūrongo Nama 10 Unicode kohinga algorithm

Nga taumahatanga o te ahua i unicode.org

ICU — te whakatinanatanga o te whare pukapuka mo te mahi tahi me te Waehereao mai i IBM.

Whakamātautau kōmaka mā te whakamahi ICU

Taumaha pūāhua i roto i ISO 14651

Whakaahuatanga o te whakatakotoranga konae me nga unahi ISO 14652

Te matapaki mo te whakataurite aho i roto glibc

Source: will.com

Tāpiri i te kōrero