லினக்ஸின் வரிசை எவ்வாறு சரங்களை வரிசைப்படுத்துகிறது

அறிமுகம்

இது அனைத்தும் முகவரி தகவலை இணைக்கும் ஒரு குறுகிய ஸ்கிரிப்டுடன் தொடங்கியது மின்னஞ்சல் அஞ்சல் பட்டியல் பயனர்களின் பட்டியலிலிருந்து பெறப்பட்ட ஊழியர்கள், மனிதவளத் துறை தரவுத்தளத்திலிருந்து பெறப்பட்ட பணியாளர் பதவிகள். இரண்டு பட்டியல்களும் யூனிகோட் உரை கோப்புகளுக்கு ஏற்றுமதி செய்யப்பட்டன யுடிஎஃப் 8 மற்றும் Unix வரி முடிவுகளுடன் சேமிக்கப்பட்டது.

உள்ளடக்கம் mail.txt

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

உள்ளடக்கம் buhg.txt

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

ஒன்றிணைக்க, கோப்புகள் Unix கட்டளை மூலம் வரிசைப்படுத்தப்பட்டன வகையான மற்றும் யூனிக்ஸ் திட்டத்தின் உள்ளீட்டிற்கு சமர்ப்பிக்கப்பட்டது சேர, இது எதிர்பாராதவிதமாக ஒரு பிழையால் தோல்வியடைந்தது:

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

உங்கள் கண்களால் வரிசையாக்க முடிவைப் பார்ப்பது, பொதுவாக, வரிசையாக்கம் சரியானது என்பதைக் காட்டுகிறது, ஆனால் ஆண் மற்றும் பெண் குடும்பப்பெயர்களின் தற்செயல் நிகழ்வுகளில், ஆண்களுக்கு முன்னால் பெண்களே வருகிறார்கள்:

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

யூனிகோடில் வரிசையாக்கத் தடுமாற்றம் போல் அல்லது வரிசைப்படுத்தும் வழிமுறையில் பெண்ணியத்தின் வெளிப்பாடாகத் தெரிகிறது. முதலாவது, நிச்சயமாக, மிகவும் நம்பத்தகுந்ததாகும்.

இப்போதைக்கு தள்ளி வைக்கலாம் சேர மற்றும் கவனம் செலுத்துங்கள் வகையான. விஞ்ஞான குத்துமதிப்பைப் பயன்படுத்தி சிக்கலைத் தீர்க்க முயற்சிப்போம். முதலில், இடத்தை மாற்றுவோம் பு.பு. மீது ru_RU. வரிசைப்படுத்த, சூழல் மாறியை அமைக்க போதுமானதாக இருக்கும் LC_COLLATE, ஆனால் அற்ப விஷயங்களில் நேரத்தை வீணாக்க மாட்டோம்:

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

எதுவும் மாறவில்லை.

ஒற்றை பைட் குறியாக்கத்தில் கோப்புகளை மறுகுறியீடு செய்ய முயற்சிப்போம்:

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

மீண்டும் எதுவும் மாறவில்லை.

உங்களால் எதுவும் செய்ய முடியாது, நீங்கள் இணையத்தில் தீர்வைத் தேட வேண்டும். ரஷ்ய குடும்பப்பெயர்களைப் பற்றி நேரடியாக எதுவும் இல்லை, ஆனால் பிற வரிசையாக்க விந்தைகள் பற்றி கேள்விகள் உள்ளன. உதாரணமாக, இங்கே ஒரு சிக்கல் உள்ளது: unix வரிசையானது ‘-’ (கோடு) எழுத்துக்களை கண்ணுக்கு தெரியாததாகக் கருதுகிறது. சுருக்கமாக, "a-b", "aa", "ac" சரங்கள் "aa", "a-b", "ac" என வரிசைப்படுத்தப்படுகின்றன.

பதில் எல்லா இடங்களிலும் நிலையானது: புரோகிராமர் லோகேலைப் பயன்படுத்தவும் "சி" மற்றும் நீங்கள் மகிழ்ச்சியாக இருப்பீர்கள். நாம் முயற்சிப்போம்:

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

ஏதோ மாறிவிட்டது. யோல்கினா எங்கோ நழுவினாலும் இவானோவ்ஸ் சரியான வரிசையில் வரிசையாக நின்றார். அசல் சிக்கலுக்குத் திரும்புவோம்:

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

இணையம் உறுதியளித்தபடி இது பிழைகள் இல்லாமல் வேலை செய்தது. இது முதல் வரியில் யோல்கினா இருந்தபோதிலும்.

சிக்கல் தீர்க்கப்பட்டதாகத் தெரிகிறது, ஆனால் மற்றொரு ரஷ்ய குறியாக்கத்தை முயற்சிப்போம் - விண்டோஸ் CP1251:

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

வரிசையாக்க முடிவு, விந்தை போதும், இடத்துடன் ஒத்துப்போகும் "சி", மற்றும் முழு உதாரணம், அதன்படி, பிழைகள் இல்லாமல் இயங்கும். ஒருவித மாயவாதம்.

நிரலாக்கத்தில் உள்ள மாயவாதம் எனக்குப் பிடிக்கவில்லை, ஏனெனில் இது பொதுவாக தவறுகளை மறைக்கிறது. இது எவ்வாறு செயல்படுகிறது என்பதை நாம் தீவிரமாக ஆராய வேண்டும். வகையான மற்றும் அது என்ன பாதிக்கிறது? LC_COLLATE .

முடிவில் நான் கேள்விகளுக்கு பதிலளிக்க முயற்சிப்பேன்:

  • பெண் குடும்பப்பெயர்கள் ஏன் தவறாக வரிசைப்படுத்தப்பட்டன?
  • ஏன் LANG=ru_RU.CP1251 சமமாக மாறியது LANG=C
  • ஏன் செய்கிறது வகையான и சேர வரிசைப்படுத்தப்பட்ட சரங்களின் வரிசையைப் பற்றிய பல்வேறு கருத்துக்கள்
  • எனது எல்லா உதாரணங்களிலும் ஏன் பிழைகள் உள்ளன?
  • இறுதியாக உங்கள் விருப்பப்படி சரங்களை வரிசைப்படுத்துவது எப்படி

யூனிகோடில் வரிசைப்படுத்துதல்

முதல் நிறுத்தத்தில் தொழில்நுட்ப அறிக்கை எண். 10 என்ற தலைப்பில் இருக்கும் யூனிகோட் தொகுப்பு அல்காரிதம் ஆன்லைன் unicode.org. அறிக்கையில் நிறைய தொழில்நுட்ப விவரங்கள் உள்ளன, எனவே முக்கிய யோசனைகளின் சுருக்கமான சுருக்கத்தை தருகிறேன்.

தொகுப்பு — சரங்களை "ஒப்பிடுதல்" என்பது எந்த வரிசையாக்க வழிமுறையின் அடிப்படையாகும். அல்காரிதம்கள் தாங்களாகவே வேறுபடலாம் ("குமிழி", "ஒன்று", "வேகமாக"), ஆனால் அவை தோன்றும் வரிசையைத் தீர்மானிக்க அவை அனைத்தும் ஒரு ஜோடி சரங்களின் ஒப்பீட்டைப் பயன்படுத்தும்.

இயற்கையான மொழியில் சரங்களை வரிசைப்படுத்துவது மிகவும் சிக்கலான பிரச்சனை. எளிமையான ஒற்றை-பைட் குறியாக்கங்களில் கூட, எழுத்துக்களில் உள்ள எழுத்துக்களின் வரிசை, ஆங்கில லத்தீன் எழுத்துக்களில் இருந்து வேறுபட்டாலும், இந்த எழுத்துக்கள் குறியிடப்பட்ட எண் மதிப்புகளின் வரிசையுடன் இனி ஒத்துப்போவதில்லை. எனவே ஜெர்மன் எழுத்துக்களில் கடிதம் Ö இடையே நிற்கிறது О и P, மற்றும் குறியாக்கத்தில் CP850 அவள் இடையில் வருகிறாள் ÿ и Ü.

நீங்கள் ஒரு குறிப்பிட்ட குறியாக்கத்திலிருந்து சுருக்க முயற்சி செய்யலாம் மற்றும் யூனிகோடில் செய்யப்பட்டுள்ளபடி, சில வரிசையில் வரிசைப்படுத்தப்பட்ட "சிறந்த" எழுத்துக்களைக் கருத்தில் கொள்ளலாம். குறியாக்கங்கள் UTF8, UTF16 அல்லது ஒரு பைட் KOI8-R (யுனிகோடின் வரையறுக்கப்பட்ட துணைக்குழு தேவைப்பட்டால்) எழுத்துக்களின் வெவ்வேறு எண் பிரதிநிதித்துவங்களைக் கொடுக்கும், ஆனால் அடிப்படை அட்டவணையின் அதே கூறுகளைப் பார்க்கவும்.

நாம் புதிதாக ஒரு குறியீட்டு அட்டவணையை உருவாக்கினாலும், அதற்கு உலகளாவிய குறியீட்டு வரிசையை ஒதுக்க முடியாது என்று மாறிவிடும். ஒரே எழுத்துக்களைப் பயன்படுத்தும் வெவ்வேறு தேசிய எழுத்துக்களில், இந்த எழுத்துக்களின் வரிசை வேறுபடலாம். உதாரணமாக, பிரெஞ்சு மொழியில் Æ ஒரு லிகேச்சராகக் கருதப்பட்டு சரமாக வரிசைப்படுத்தப்படும் AE. நார்வேஜிய மொழியில் Æ ஒரு தனி கடிதமாக இருக்கும், இது பின்னர் அமைந்துள்ளது Z. மூலம், போன்ற ligatures கூடுதலாக Æ பல குறியீடுகளுடன் எழுதப்பட்ட கடிதங்கள் உள்ளன. எனவே செக் எழுத்துக்களில் ஒரு எழுத்து உள்ளது Ch, இடையே நிற்கிறது H и I.

எழுத்துக்களில் உள்ள வேறுபாடுகளுக்கு கூடுதலாக, வரிசையாக்கத்தை பாதிக்கும் பிற தேசிய மரபுகள் உள்ளன. குறிப்பாக, கேள்வி எழுகிறது: பெரிய எழுத்து மற்றும் சிறிய எழுத்துக்களைக் கொண்ட சொற்கள் அகராதியில் எந்த வரிசையில் தோன்ற வேண்டும்? நிறுத்தற்குறிகளைப் பயன்படுத்துவதால் வரிசைப்படுத்துதல் பாதிக்கப்படலாம். ஸ்பானிஷ் மொழியில், விசாரணை வாக்கியத்தின் தொடக்கத்தில் தலைகீழ் கேள்விக்குறி பயன்படுத்தப்படுகிறது (உங்களுக்கு இசை பிடிக்குமா?) இந்த வழக்கில், விசாரணை வாக்கியங்களை எழுத்துக்களுக்கு வெளியே ஒரு தனி கிளஸ்டராக தொகுக்கக்கூடாது என்பது வெளிப்படையானது, ஆனால் மற்ற நிறுத்தற்குறிகளுடன் வரிகளை எவ்வாறு வரிசைப்படுத்துவது?

ஐரோப்பிய மொழிகளிலிருந்து மிகவும் வித்தியாசமான மொழிகளில் சரங்களை வரிசைப்படுத்துவதில் நான் கவனம் செலுத்த மாட்டேன். வலமிருந்து இடமாகவோ அல்லது மேலிருந்து கீழாகவோ எழுதும் திசையைக் கொண்ட மொழிகளில், வரிகளில் உள்ள எழுத்துக்கள் பெரும்பாலும் வாசிப்பு வரிசையில் சேமிக்கப்படும், மேலும் அகரவரிசை அல்லாத எழுத்து முறைகள் கூட வரிகளை எழுத்துக்கு ஏற்றவாறு வரிசைப்படுத்தும் வழிகளைக் கொண்டுள்ளன. . எடுத்துக்காட்டாக, ஹைரோகிளிஃப்களை பாணி மூலம் வரிசைப்படுத்தலாம் (சீன எழுத்துக்கள் விசைகள்) அல்லது உச்சரிப்பு மூலம். உண்மையைச் சொல்வதென்றால், எமோஜிகளை எப்படி ஏற்பாடு செய்ய வேண்டும் என்று எனக்குத் தெரியவில்லை, ஆனால் நீங்கள் அவர்களுக்காக ஏதாவது ஒன்றைக் கொண்டு வரலாம்.

மேலே பட்டியலிடப்பட்டுள்ள அம்சங்களின் அடிப்படையில், யூனிகோட் அட்டவணைகளின் அடிப்படையில் சரங்களை ஒப்பிடுவதற்கான அடிப்படைத் தேவைகள் உருவாக்கப்பட்டன:

  • சரங்களின் ஒப்பீடு குறியீடு அட்டவணையில் உள்ள எழுத்துக்களின் நிலையைப் பொறுத்தது அல்ல;
  • ஒற்றை எழுத்தை உருவாக்கும் எழுத்துக்களின் வரிசைகள் நியமன வடிவத்திற்கு குறைக்கப்படுகின்றன (A + மேல் வட்டம் அதே தான் Å);
  • சரங்களை ஒப்பிடும் போது, ​​ஒரு எழுத்து சரத்தின் சூழலில் கருதப்படுகிறது மற்றும் தேவைப்பட்டால், அதன் அண்டை நாடுகளுடன் ஒரு யூனிட் ஒப்பீடு (Ch செக்கில்) அல்லது பல பிரிக்கப்பட்டுள்ளது (Æ பிரெஞ்சு மொழியில்);
  • அனைத்து தேசிய அம்சங்களும் (எழுத்துக்கள், பெரிய எழுத்து/சிறிய எழுத்து, நிறுத்தற்குறிகள், எழுதும் வகைகளின் வரிசை) வரிசையின் கைமுறையாக ஒதுக்கப்படும் வரை (எமோஜி) கட்டமைக்கப்பட வேண்டும்;
  • வரிசைப்படுத்துவதற்கு மட்டுமின்றி, பல இடங்களிலும் ஒப்பீடு முக்கியமானது, எடுத்துக்காட்டாக வரிசை வரம்புகளைக் குறிப்பிடுவதற்கு ({A... z} இல் மாற்று பாஷ்);
  • ஒப்பீடு மிகவும் விரைவாக செய்யப்பட வேண்டும்.

கூடுதலாக, அறிக்கையின் ஆசிரியர்கள், அல்காரிதம் டெவலப்பர்கள் சார்ந்திருக்கக் கூடாத ஒப்பீட்டு பண்புகளை உருவாக்கியுள்ளனர்:

  • ஒப்பீட்டு வழிமுறைக்கு ஒவ்வொரு மொழிக்கும் தனித்தனி எழுத்துக்கள் தேவையில்லை (ரஷ்ய மற்றும் உக்ரேனிய மொழிகள் பெரும்பாலான சிரிலிக் எழுத்துக்களைப் பகிர்ந்து கொள்கின்றன);
  • ஒப்பீடு யூனிகோட் அட்டவணையில் உள்ள எழுத்துக்களின் வரிசையை நம்பியிருக்கக்கூடாது;
  • சரத்தின் எடை சரத்தின் பண்புக்கூறாக இருக்கக்கூடாது, ஏனெனில் வெவ்வேறு கலாச்சார சூழல்களில் ஒரே சரம் வெவ்வேறு எடைகளைக் கொண்டிருக்கலாம்;
  • ஒன்றிணைக்கும் போது அல்லது பிரிக்கும் போது வரிசை எடைகள் மாறலாம் (இருந்து x < y அதை பின்பற்றுவதில்லை xz < yz);
  • வரிசையாக்க வழிமுறையின் பார்வையில் ஒரே எடையைக் கொண்ட வெவ்வேறு சரங்கள் சமமாகக் கருதப்படுகின்றன. அத்தகைய சரங்களின் கூடுதல் வரிசையை அறிமுகப்படுத்துவது சாத்தியம், ஆனால் அது செயல்திறனைக் குறைக்கலாம்;
  • மீண்டும் மீண்டும் வரிசைப்படுத்தும்போது, ​​அதே எடைகள் கொண்ட வரிசைகள் மாற்றப்படலாம். வலிமை என்பது ஒரு குறிப்பிட்ட வரிசையாக்க வழிமுறையின் பண்பு, மற்றும் சரம் ஒப்பீட்டு அல்காரிதத்தின் பண்பு அல்ல (முந்தைய பத்தியைப் பார்க்கவும்);
  • பண்பாட்டு மரபுகள் செம்மைப்படுத்தும்போது/மாறும்போது வரிசையாக்க விதிகள் காலப்போக்கில் மாறலாம்.

செயலாக்கப்படும் சரங்களின் சொற்பொருள் பற்றி ஒப்பீட்டு அல்காரிதம் எதுவும் தெரியாது என்றும் விதிக்கப்பட்டுள்ளது. எனவே, இலக்கங்களை மட்டுமே கொண்ட சரங்களை எண்களாக ஒப்பிடக்கூடாது, மேலும் ஆங்கிலப் பெயர்களின் பட்டியல்களில் கட்டுரை (பீட்டில்ஸ், தி).

இந்தத் தேவைகள் அனைத்தையும் பூர்த்தி செய்வதற்காக, பல-நிலை (உண்மையில் நான்கு-நிலை) அட்டவணை வரிசையாக்க வழிமுறை முன்மொழியப்பட்டது.

முன்னதாக, சரத்தில் உள்ள எழுத்துக்கள் நியமன வடிவத்திற்கு குறைக்கப்பட்டு, ஒப்பீட்டு அலகுகளாக தொகுக்கப்பட்டுள்ளன. ஒப்பீட்டின் ஒவ்வொரு அலகுக்கும் பல எடைகள் ஒதுக்கப்பட்டுள்ளன, இது பல நிலைகளில் ஒப்பிடப்படுகிறது. ஒப்பீட்டு அலகுகளின் எடைகள் வரிசைப்படுத்தப்பட்ட தொகுப்புகளின் கூறுகள் (இந்த விஷயத்தில், முழு எண்கள்) அவை அதிகமாகவோ அல்லது குறைவாகவோ ஒப்பிடலாம். சிறப்பு பொருள் புறக்கணிக்கப்பட்டது (0x0) என்பது தொடர்புடைய ஒப்பீட்டு மட்டத்தில் இந்த அலகு ஒப்பிடுதலில் ஈடுபடவில்லை. சரங்களின் ஒப்பீடு தொடர்புடைய நிலைகளின் எடையைப் பயன்படுத்தி பல முறை மீண்டும் மீண்டும் செய்யப்படலாம். ஒவ்வொரு மட்டத்திலும், இரண்டு வரிசைகளின் ஒப்பீட்டு அலகுகளின் எடைகள் ஒன்றோடொன்று வரிசையாக ஒப்பிடப்படுகின்றன.

வெவ்வேறு தேசிய மரபுகளுக்கான அல்காரிதத்தின் வெவ்வேறு செயலாக்கங்களில், குணகங்களின் மதிப்புகள் வேறுபடலாம், ஆனால் யூனிகோட் தரநிலை எடைகளின் அடிப்படை அட்டவணையை உள்ளடக்கியது - "இயல்புநிலை யூனிகோட் தொகுப்பு உறுப்பு அட்டவணை" (DUCET) மாறியை அமைப்பதை நான் கவனிக்க விரும்புகிறேன் LC_COLLATE உண்மையில் சரம் ஒப்பீட்டு செயல்பாட்டில் எடை அட்டவணையின் தேர்வுக்கான அறிகுறியாகும்.

எடை குணகங்கள் DUCET பின்வருமாறு ஏற்பாடு செய்யப்பட்டுள்ளது:

  • முதல் நிலையில், அனைத்து எழுத்துக்களும் ஒரே மாதிரியாகக் குறைக்கப்படுகின்றன, டயக்ரிடிக்ஸ் நிராகரிக்கப்படுகின்றன, நிறுத்தற்குறிகள் (அனைத்தும் இல்லை) புறக்கணிக்கப்படுகின்றன;
  • இரண்டாவது மட்டத்தில், diacritics மட்டுமே கணக்கில் எடுத்துக்கொள்ளப்படுகிறது;
  • மூன்றாவது மட்டத்தில், வழக்கு மட்டுமே கணக்கில் எடுத்துக்கொள்ளப்படுகிறது;
  • நான்காவது நிலையில், நிறுத்தற்குறிகள் மட்டுமே கணக்கில் எடுத்துக்கொள்ளப்படும்.

ஒப்பீடு பல பாஸ்களில் நடைபெறுகிறது: முதலில், முதல் நிலையின் குணகங்கள் ஒப்பிடப்படுகின்றன; எடைகள் ஒத்துப்போனால், இரண்டாவது நிலை எடைகளுடன் மீண்டும் மீண்டும் ஒப்பீடு செய்யப்படுகிறது; பின்னர் ஒருவேளை மூன்றாவது மற்றும் நான்காவது.

வரிசைகள் வெவ்வேறு எடைகளுடன் ஒப்பிடும் அலகுகளைக் கொண்டிருக்கும்போது ஒப்பீடு முடிவடைகிறது. நான்கு நிலைகளிலும் சம எடை கொண்ட வரிசைகள் ஒன்றுக்கொன்று சமமாகக் கருதப்படுகின்றன.

இந்த அல்காரிதம் (கூடுதல் தொழில்நுட்ப விவரங்களுடன்) அறிக்கை எண். 10-க்கு பெயர் கொடுத்தது - "யூனிகோட் தொகுப்பு அல்காரிதம்" (ACU).

இங்குதான் எங்கள் உதாரணத்திலிருந்து வரிசைப்படுத்தும் நடத்தை கொஞ்சம் தெளிவாகிறது. யுனிகோட் தரத்துடன் ஒப்பிட்டுப் பார்த்தால் நன்றாக இருக்கும்.

செயலாக்கங்களைச் சோதிக்க ACU ஒரு சிறப்பு உள்ளது சோதனை, பயன்படுத்தி எடை கோப்பு, செயல்படுத்தி DUCET. ஸ்கேல்ஸ் கோப்பில் அனைத்து வகையான வேடிக்கையான விஷயங்களையும் நீங்கள் காணலாம். எடுத்துக்காட்டாக, மஹ்ஜோங் மற்றும் ஐரோப்பிய டோமினோக்களின் வரிசையும், அட்டைகளின் அடுக்கில் உள்ள வழக்குகளின் வரிசையும் உள்ளது (சின்னம் 1F000 மேலும்). கார்டு சூட்கள் பிரிட்ஜ் - PCBT விதிகளின்படி வைக்கப்படுகின்றன, மேலும் சூட்டில் உள்ள அட்டைகள் T, 2,3, XNUMX... K வரிசையில் உள்ளன.

வரிசைகள் சரியாக வரிசைப்படுத்தப்பட்டுள்ளதா என்பதை கைமுறையாக சரிபார்க்கிறது DUCET மிகவும் கடினமானதாக இருக்கும், ஆனால், அதிர்ஷ்டவசமாக எங்களுக்கு, யூனிகோடுடன் பணிபுரியும் நூலகத்தின் முன்மாதிரியான செயலாக்கம் உள்ளது - "யுனிகோடுக்கான சர்வதேச கூறுகள்"((தீவிர சிகிச்சை பிரிவில்).

இந்த நூலகத்தின் இணையதளத்தில், உருவாக்கப்பட்டது ஐபிஎம், உள்ளிட்ட டெமோ பக்கங்கள் உள்ளன சரம் ஒப்பீட்டு அல்காரிதம் பக்கம். நாங்கள் எங்கள் சோதனை வரிகளை இயல்புநிலை அமைப்புகளுடன் உள்ளிடுகிறோம், இதோ, நாங்கள் சரியான ரஷ்ய வரிசையாக்கத்தைப் பெறுகிறோம்.

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

மூலம், இணையதளம் தீவிர சிகிச்சை பிரிவில் நிறுத்தற்குறிகளை செயலாக்கும்போது ஒப்பீட்டு வழிமுறையின் தெளிவுபடுத்தலை நீங்கள் காணலாம். உதாரணங்களில் தொகுப்பு FAQ அபோஸ்ட்ரோபி மற்றும் ஹைபன் புறக்கணிக்கப்படுகின்றன.

யூனிகோட் எங்களுக்கு உதவியது, ஆனால் விசித்திரமான நடத்தைக்கான காரணங்களைத் தேடுங்கள் வகையான в லினக்ஸ் வேறு எங்காவது செல்ல வேண்டும்.

glibc இல் வரிசைப்படுத்துதல்

பயன்பாட்டு மூலக் குறியீடுகளின் விரைவான பார்வை வகையான из குனு கோர் பயன்பாடுகள் பயன்பாட்டில், உள்ளூர்மயமாக்கல் மாறியின் தற்போதைய மதிப்பை அச்சிடுவதற்கு வருகிறது என்பதைக் காட்டுகிறது LC_COLLATE பிழைத்திருத்த பயன்முறையில் இயங்கும் போது:

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

நிலையான செயல்பாட்டைப் பயன்படுத்தி சரம் ஒப்பீடுகள் செய்யப்படுகின்றன strcoll, அதாவது சுவாரஸ்யமான அனைத்தும் நூலகத்தில் உள்ளது glibc.

மீது விக்கி திட்டம் glibc சரம் ஒப்பீடு அர்ப்பணிக்கப்பட்ட ஒரு பத்தி. இந்த பத்தியில் இருந்து புரிந்து கொள்ளலாம் glibc வரிசையாக்கம் ஏற்கனவே நமக்குத் தெரிந்த அல்காரிதம் அடிப்படையிலானது ACU (யூனிகோட் தொகுப்பு அல்காரிதம்) மற்றும்/அல்லது அதற்கு நெருக்கமான தரத்தில் ஐஎஸ்ஓ 14651 (சர்வதேச சரம் வரிசைப்படுத்துதல் மற்றும் ஒப்பீடு) சமீபத்திய தரநிலையைப் பொறுத்தவரை, தளத்தில் இருப்பதைக் கவனத்தில் கொள்ள வேண்டும் standards.iso.org ஐஎஸ்ஓ 14651 அதிகாரப்பூர்வமாக பொதுவில் கிடைக்கும் என்று அறிவிக்கப்பட்டது, ஆனால் தொடர்புடைய இணைப்பு இல்லாத பக்கத்திற்கு வழிவகுக்கிறது. நூறு யூரோக்களுக்கு ஒரு மின்னணு நகலை வாங்குவதற்கான அதிகாரப்பூர்வ தளங்களுக்கான இணைப்புகளுடன் பல பக்கங்களை Google வழங்குகிறது, ஆனால் தேடல் முடிவுகளின் மூன்றாவது அல்லது நான்காவது பக்கத்தில் நேரடி இணைப்புகளும் உள்ளன. எம். பொதுவாக, தரநிலை நடைமுறையில் வேறுபட்டதல்ல ACU, ஆனால் சரம் வரிசையாக்கத்தின் தேசிய அம்சங்களின் தெளிவான எடுத்துக்காட்டுகள் இல்லாததால் படிக்க மிகவும் சலிப்பாக இருக்கிறது.

மிகவும் சுவாரஸ்யமான தகவல் விக்கி ஒரு இணைப்பு இருந்தது பிழை கண்காணிப்பான் சரம் ஒப்பீட்டை செயல்படுத்துவது பற்றிய விவாதத்துடன் glibc. என்பதை விவாதத்தில் இருந்து தெரிந்து கொள்ளலாம் glibc சரங்களை ஒப்பிட பயன்படுகிறது ஐஎஸ்ஓதனிப்பட்ட அட்டவணை பொதுவான டெம்ப்ளேட் அட்டவணை (CTT), அதன் முகவரியை விண்ணப்பத்தில் காணலாம் A தரநிலை ஐஎஸ்ஓ 14651. 2000 மற்றும் 2015 க்கு இடையில் இந்த அட்டவணையில் glibc பராமரிப்பாளர் இல்லை மற்றும் தரநிலையின் தற்போதைய பதிப்பிலிருந்து முற்றிலும் வேறுபட்டது (குறைந்தது வெளிப்புறமாக). 2015 முதல் 2018 வரை, அட்டவணையின் புதிய பதிப்பிற்குத் தழுவல் நடந்தது, இப்போது நிஜ வாழ்க்கையில் அட்டவணையின் புதிய பதிப்பைச் சந்திக்க உங்களுக்கு வாய்ப்பு உள்ளது (CentOS 8), மற்றும் பழைய (CentOS 7).

இப்போது அல்காரிதம் மற்றும் துணை அட்டவணைகள் பற்றிய அனைத்து தகவல்களும் எங்களிடம் உள்ளன, அசல் சிக்கலுக்குத் திரும்பி, ரஷ்ய மொழியில் சரங்களை எவ்வாறு சரியாக வரிசைப்படுத்துவது என்பதைப் புரிந்து கொள்ளலாம்.

ISO 14651 / 14652

நாங்கள் ஆர்வமாக உள்ள அட்டவணையின் மூல குறியீடு CTT பெரும்பாலான விநியோகங்களில் லினக்ஸ் பட்டியலில் உள்ளது /usr/share/i18n/locales/. அட்டவணையே கோப்பில் உள்ளது iso14651_t1_common. பின்னர் இது கோப்பு உத்தரவு நகல் iso14651_t1_common கோப்பில் சேர்க்கப்பட்டுள்ளது iso14651_t1, இதையொட்டி, தேசிய கோப்புகளில் சேர்க்கப்பட்டுள்ளது பு.பு. и ru_RU. பெரும்பாலான விநியோகங்களில் லினக்ஸ் அனைத்து மூல கோப்புகளும் அடிப்படை நிறுவலில் சேர்க்கப்பட்டுள்ளன, ஆனால் அவை இல்லை என்றால், நீங்கள் விநியோகத்திலிருந்து கூடுதல் தொகுப்பை நிறுவ வேண்டும்.

கோப்பு அமைப்பு iso14651_t1 பெயர்களை உருவாக்குவதற்கான வெளிப்படையான விதிகளுடன், பயங்கரமான சொற்களஞ்சியமாகத் தோன்றலாம், ஆனால் நீங்கள் அதைப் பார்த்தால், எல்லாம் மிகவும் எளிமையானது. கட்டமைப்பு தரநிலையில் விவரிக்கப்பட்டுள்ளது ஐஎஸ்ஓ 14652, இதன் நகலை இணையதளத்தில் இருந்து பதிவிறக்கம் செய்து கொள்ளலாம் open-std.org. கோப்பு வடிவத்தின் மற்றொரு விளக்கத்தை படிக்கலாம் விவரக்குறிப்புகள் ஆனால் POSIX இருந்து OpenGroup. தரநிலையை வாசிப்பதற்கு மாற்றாக, நீங்கள் செயல்பாட்டின் மூலக் குறியீட்டைப் படிக்கலாம் தொகுத்து_வாசிப்பு в glibc/locale/programs/ld-collate.c.

கோப்பு அமைப்பு இதுபோல் தெரிகிறது:

இயல்பாக, எழுத்து ஒரு தப்பிக்கும் எழுத்தாகப் பயன்படுத்தப்படுகிறது, மேலும் # எழுத்துக்குப் பிறகு வரியின் முடிவு ஒரு கருத்து. இரண்டு குறியீடுகளும் மறுவரையறை செய்யப்படலாம், இது அட்டவணையின் புதிய பதிப்பில் செய்யப்படுகிறது:

escape_char /
comment_char %

கோப்பு வடிவத்தில் டோக்கன்களைக் கொண்டிருக்கும் அல்லது (எங்கே x - ஹெக்ஸாடெசிமல் இலக்கம்). இது குறியாக்கத்தில் உள்ள யூனிகோட் குறியீடு புள்ளிகளின் ஹெக்ஸாடெசிமல் பிரதிநிதித்துவமாகும் UCS-4 (யுடிஎஃப் 32) கோண அடைப்புக்குறிக்குள் உள்ள மற்ற அனைத்து கூறுகளும் (உட்பட , <2> மற்றும் போன்றவை) சூழலுக்கு வெளியே சிறிய பொருளைக் கொண்ட எளிய சரம் மாறிலிகளாகக் கருதப்படுகின்றன.

வரி LC_COLLATE சரங்களின் ஒப்பீட்டை விவரிக்கும் தரவை அடுத்து தொடங்குகிறது என்று நமக்குச் சொல்கிறது.

முதலில், ஒப்பீட்டு அட்டவணையில் உள்ள எடைகளுக்கு பெயர்கள் மற்றும் குறியீட்டு சேர்க்கைகளுக்கான பெயர்கள் குறிப்பிடப்படுகின்றன. பொதுவாக, இரண்டு வகையான பெயர்களும் இரண்டு வெவ்வேறு நிறுவனங்களுக்கு சொந்தமானவை, ஆனால் உண்மையான கோப்பில் அவை கலக்கப்படுகின்றன. எடைகளின் பெயர்கள் முக்கிய சொல்லால் குறிப்பிடப்படுகின்றன தொகுத்தல்-சின்னம் (ஒப்பீடு எழுத்து) ஏனெனில் ஒப்பிடும் போது, ​​ஒரே எடையைக் கொண்ட யூனிகோட் எழுத்துகள் சமமான எழுத்துகளாகக் கருதப்படும்.

தற்போதைய கோப்பு திருத்தத்தில் உள்ள பிரிவின் மொத்த நீளம் சுமார் 900 வரிகள். பெயர்களின் தன்னிச்சையான தன்மை மற்றும் பல வகையான தொடரியல் ஆகியவற்றைக் காட்ட நான் பல இடங்களிலிருந்து எடுத்துக்காட்டுகளை எடுத்தேன்.

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>"

  • collating-symbol ஒரு சரத்தை பதிவு செய்கிறது OSMANYA செதில்களின் பெயர்களின் அட்டவணையில்
  • collating-symbol .. முன்னொட்டைக் கொண்ட பெயர்களின் வரிசையை பதிவு செய்கிறது S மற்றும் ஹெக்ஸாடெசிமல் எண் பின்னொட்டு 1D000 செய்ய 1 டி 35 எஃப்.
  • FFFF в collating-symbol ஹெக்ஸாடெசிமலில் ஒரு பெரிய கையொப்பமிடப்படாத முழு எண் போல் தெரிகிறது, ஆனால் அது போல் தோற்றமளிக்கும் பெயர்
  • имя குறியாக்கத்தில் குறியீடு புள்ளி என்று பொருள் UCS-4
  • "" இலிருந்து collating-element ஒரு ஜோடி யூனிகோட் புள்ளிகளுக்கு புதிய பெயரை பதிவு செய்கிறது.

எடைகளின் பெயர்கள் வரையறுக்கப்பட்டவுடன், உண்மையான எடைகள் குறிப்பிடப்படுகின்றன. ஒப்பிடுகையில் அதிக-குறைவான உறவுகள் மட்டுமே முக்கியம் என்பதால், எடைகள் பட்டியல் பெயர்களின் எளிய வரிசையால் தீர்மானிக்கப்படுகின்றன. "இலகுவான" எடைகள் முதலில் பட்டியலிடப்பட்டுள்ளன, பின்னர் "கனமானவை". ஒவ்வொரு யூனிகோட் எழுத்துக்கும் நான்கு வெவ்வேறு எடைகள் ஒதுக்கப்பட்டுள்ளன என்பதை உங்களுக்கு நினைவூட்டுகிறேன். இங்கே அவை ஒரே வரிசையில் இணைக்கப்பட்டுள்ளன. கோட்பாட்டில், எந்தவொரு குறியீட்டு பெயரையும் நான்கு நிலைகளில் ஏதேனும் ஒன்றில் பயன்படுத்தலாம், ஆனால் டெவலப்பர்கள் மனதளவில் பெயர்களை நிலைகளாகப் பிரிப்பதை கருத்துகள் குறிப்பிடுகின்றன.

% 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

இறுதியாக, உண்மையான எடை அட்டவணை.

எடைகள் பிரிவு முக்கிய வரிகளில் இணைக்கப்பட்டுள்ளது ஆர்டர்_தொடக்கம் и ஒழுங்கு_முடிவு. கூடுதல் விருப்பங்கள் ஆர்டர்_தொடக்கம் ஒப்பீட்டின் ஒவ்வொரு மட்டத்திலும் எந்த திசையில் வரிசைகள் ஸ்கேன் செய்யப்படுகின்றன என்பதை தீர்மானிக்கவும். இயல்புநிலை அமைப்பாகும் முன்னோக்கி. பிரிவின் உடல் குறியீட்டு குறியீடு மற்றும் அதன் நான்கு எடைகளைக் கொண்ட கோடுகளைக் கொண்டுள்ளது. எழுத்துக் குறியீட்டை எழுத்துப் புள்ளி, குறியீடு புள்ளி அல்லது முன்னர் வரையறுக்கப்பட்ட குறியீட்டுப் பெயரால் குறிப்பிடலாம். குறியீட்டுப் பெயர்கள், குறியீட்டுப் புள்ளிகள் அல்லது சின்னங்களுக்கே எடைகள் கொடுக்கப்படலாம். குறியீடு புள்ளிகள் அல்லது எழுத்துக்கள் பயன்படுத்தப்பட்டால், அவற்றின் எடை குறியீடு புள்ளியின் எண் மதிப்பு (யூனிகோட் அட்டவணையில் உள்ள நிலை) போலவே இருக்கும். வெளிப்படையாகக் குறிப்பிடப்படாத எழுத்துகள் (நான் புரிந்து கொண்டபடி) யூனிகோட் அட்டவணையில் உள்ள நிலைக்குப் பொருந்தக்கூடிய முதன்மை எடையுடன் அட்டவணைக்கு ஒதுக்கப்பட்டதாகக் கருதப்படுகிறது. சிறப்பு எடை மதிப்பு இக்னோர் ஒப்பீட்டின் பொருத்தமான மட்டத்தில் சின்னம் புறக்கணிக்கப்படுகிறது என்று அர்த்தம்.

செதில்களின் கட்டமைப்பை நிரூபிக்க, நான் மூன்று வெளிப்படையான துண்டுகளைத் தேர்ந்தெடுத்தேன்:

  • முற்றிலும் புறக்கணிக்கப்பட்ட எழுத்துக்கள்
  • முதல் இரண்டு நிலைகளில் உள்ள எண் மூன்றுக்கு சமமான குறியீடுகள்
  • சிரிலிக் எழுத்துக்களின் ஆரம்பம், இதில் diacritics இல்லை, எனவே முக்கியமாக முதல் மற்றும் மூன்றாவது நிலைகளால் வரிசைப்படுத்தப்படுகிறது.

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

இப்போது நீங்கள் கட்டுரையின் தொடக்கத்திலிருந்து எடுத்துக்காட்டுகளை வரிசைப்படுத்தலாம். எடை அட்டவணையின் இந்த பகுதியில் பதுங்கி உள்ளது:

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

இந்த அட்டவணையில் அட்டவணையில் இருந்து நிறுத்தற்குறிகள் இருப்பதைக் காணலாம் ஆஸ்கி சரங்களை ஒப்பிடும் போது (இடம் உட்பட) கிட்டத்தட்ட எப்போதும் புறக்கணிக்கப்படும். பொருந்தக்கூடிய நிலைகளில் காணப்படும் நிறுத்தற்குறிகளைத் தவிர மற்ற எல்லாவற்றிலும் பொருந்தக்கூடிய கோடுகள் மட்டுமே விதிவிலக்குகள். ஒப்பீட்டு வழிமுறைக்கான எனது உதாரணத்திலிருந்து (வரிசைப்படுத்திய பின்) வரிகள் இப்படி இருக்கும்:

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

அளவீடுகளின் அட்டவணையில், ரஷ்ய மொழியில் பெரிய எழுத்துக்கள் சிறிய எழுத்துக்களுக்குப் பிறகு வருகின்றன (மூன்றாவது மட்டத்தில் விட கனமானது ), வரிசையாக்கம் முற்றிலும் சரியானது.

ஒரு மாறி அமைக்கும் போது LC_COLLATTE=C பைட் பைட் ஒப்பீட்டைக் குறிப்பிடும் ஒரு சிறப்பு அட்டவணை ஏற்றப்பட்டுள்ளது

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'
};

யூனிகோடில் குறியீட்டு புள்ளி Ё A க்கு முன் வருவதால், சரங்கள் அதற்கேற்ப வரிசைப்படுத்தப்படுகின்றன.

உரை மற்றும் பைனரி அட்டவணைகள்

வெளிப்படையாக, சரம் ஒப்பீடு மிகவும் பொதுவான செயல்பாடு மற்றும் அட்டவணை பாகுபடுத்துதல் CTT மிகவும் விலையுயர்ந்த செயல்முறை. அட்டவணைக்கான அணுகலை மேம்படுத்த, அது கட்டளையுடன் பைனரி வடிவத்தில் தொகுக்கப்படுகிறது உள்ளூர் டெஃப்.

அணி உள்ளூர் டெஃப் தேசிய பண்புகளின் அட்டவணையுடன் ஒரு கோப்பை அளவுருக்களாக ஏற்றுக்கொள்கிறது (விருப்பம் -i), இதில் அனைத்து எழுத்துகளும் யூனிகோட் புள்ளிகளால் குறிப்பிடப்படுகின்றன, மேலும் யூனிகோட் புள்ளிகள் மற்றும் ஒரு குறிப்பிட்ட குறியாக்கத்தின் எழுத்துகளுக்கு இடையிலான கடிதப் பரிமாற்றக் கோப்பு (விருப்பம் -f) வேலையின் விளைவாக, கடைசி அளவுருவில் குறிப்பிடப்பட்ட பெயருடன் பைனரி கோப்புகள் லோகேலுக்கு உருவாக்கப்படுகின்றன.

glibc இரண்டு பைனரி கோப்பு வடிவங்களை ஆதரிக்கிறது: "பாரம்பரிய" மற்றும் "நவீன".

பாரம்பரிய வடிவம் என்பது, லோகேலின் பெயர், உள்ள துணை அடைவின் பெயராகும் /usr/lib/locale/. இந்த துணை அடைவு பைனரி கோப்புகளை சேமிக்கிறது LC_COLLATE, LC_CTYPE, LC_TIME மற்றும் பல. கோப்பு LC_IDENTIFICATION மொழியின் முறையான பெயர் (கோப்பகத்தின் பெயரிலிருந்து வேறுபட்டிருக்கலாம்) மற்றும் கருத்துகள் உள்ளன.

நவீன வடிவமானது அனைத்து இடங்களையும் ஒரே காப்பகத்தில் சேமிப்பதை உள்ளடக்கியது /usr/lib/locale/locale-archive, இது பயன்படுத்தும் அனைத்து செயல்முறைகளின் மெய்நிகர் நினைவகத்திற்கு வரைபடமாக்கப்பட்டது glibc. நவீன வடிவத்தில் உள்ள மொழி பெயர் சில நியமனங்களுக்கு உட்பட்டது - எண்கள் மற்றும் எழுத்துக்கள் மட்டுமே குறியாக்கப் பெயர்களில் இருக்கும். அதனால் ru_RU.KOI8-R, என சேமிக்கப்படும் ru_RU.koi8r.

உள்ளீட்டு கோப்புகள் தற்போதைய கோப்பகத்திலும், கோப்பகங்களிலும் தேடப்படுகின்றன /usr/share/i18n/locales/ и /usr/share/i18n/charmaps/ கோப்புகளுக்கு CTT மற்றும் முறையே என்கோடிங் கோப்புகள்.

உதாரணமாக, கட்டளை

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

கோப்பை தொகுக்கும் /usr/share/i18n/locales/ru_RU குறியீட்டு கோப்பைப் பயன்படுத்தி /usr/share/i18n/charmaps/MAC-CYRILLIC.gz மற்றும் முடிவை சேமிக்கவும் /usr/lib/locale/locale-archive பெயரில் ru_RU.மாசிரிலிக்

நீங்கள் மாறியை அமைத்தால் Lang = en_US.UTF-8 தி glibc பின்வரும் கோப்புகள் மற்றும் கோப்பகங்களின் வரிசையில் லோக்கல் பைனரிகளைத் தேடும்:

/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/

பாரம்பரிய மற்றும் நவீன வடிவங்களில் ஒரு இடம் ஏற்பட்டால், நவீனத்திற்கு முன்னுரிமை அளிக்கப்படும்.

கட்டளையுடன் தொகுக்கப்பட்ட இடங்களின் பட்டியலைக் காணலாம் மொழி.

உங்கள் ஒப்பீட்டு அட்டவணையைத் தயாரிக்கிறது

இப்போது, ​​அறிவு ஆயுதம், நீங்கள் உங்கள் சொந்த சிறந்த சரம் ஒப்பீட்டு அட்டவணை உருவாக்க முடியும். இந்த அட்டவணை Ё எழுத்து உட்பட ரஷ்ய எழுத்துக்களை சரியாக ஒப்பிட வேண்டும், அதே நேரத்தில் அட்டவணைக்கு ஏற்ப நிறுத்தற்குறிகளை கணக்கில் எடுத்துக்கொள்ள வேண்டும். ஆஸ்கி.

உங்கள் சொந்த வரிசையாக்க அட்டவணையைத் தயாரிக்கும் செயல்முறை இரண்டு நிலைகளைக் கொண்டுள்ளது: எடை அட்டவணையைத் திருத்துதல் மற்றும் கட்டளையுடன் பைனரி வடிவத்தில் தொகுத்தல் உள்ளூர் டெஃப்.

ஒப்பீட்டு அட்டவணையை வடிவமைப்பில், குறைந்தபட்ச எடிட்டிங் செலவுகளுடன் சரிசெய்ய வேண்டும் ஐஎஸ்ஓ 14652 ஏற்கனவே உள்ள அட்டவணையின் எடையை சரிசெய்வதற்கான பிரிவுகள் வழங்கப்பட்டுள்ளன. பிரிவு ஒரு முக்கிய சொல்லுடன் தொடங்குகிறது மறுவரிசை-பிறகு மற்றும் மாற்றீடு செய்யப்படும் நிலையைக் குறிக்கிறது. பிரிவு வரியுடன் முடிவடைகிறது மறுவரிசை-முடிவு. அட்டவணையின் பல பிரிவுகளை சரிசெய்ய வேண்டியது அவசியம் என்றால், அத்தகைய ஒவ்வொரு பகுதிக்கும் ஒரு பிரிவு உருவாக்கப்படும்.

கோப்புகளின் புதிய பதிப்புகளை நகலெடுத்தேன் iso14651_t1_common и ru_RU களஞ்சியத்தில் இருந்து glibc எனது முகப்பு கோப்பகத்திற்கு ~/.local/share/i18n/locales/ மற்றும் பகுதியை சிறிது திருத்தினேன் LC_COLLATE в ru_RU. கோப்புகளின் புதிய பதிப்புகள் எனது பதிப்போடு முழுமையாக இணக்கமாக உள்ளன glibc. கோப்புகளின் பழைய பதிப்புகளைப் பயன்படுத்த விரும்பினால், அட்டவணையில் குறியீட்டு பெயர்கள் மற்றும் மாற்றீடு தொடங்கும் இடத்தை நீங்கள் மாற்ற வேண்டும்.

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

உண்மையில், புலங்களை மாற்றுவது அவசியம் LC_IDENTIFICATION அதனால் அவர்கள் இடத்தை சுட்டிக்காட்டுகிறார்கள் ru_MY, ஆனால் எனது எடுத்துக்காட்டில் இது தேவையில்லை, ஏனெனில் உள்ளூர் தேடலில் இருந்து காப்பகத்தை நான் விலக்கினேன் இடம்-காப்பகம்.

என்று உள்ளூர் டெஃப் ஒரு மாறி மூலம் எனது கோப்புறையில் உள்ள கோப்புகளுடன் வேலை செய்தேன் I18NPATH உள்ளீட்டு கோப்புகளைத் தேட கூடுதல் கோப்பகத்தைச் சேர்க்கலாம், மேலும் பைனரி கோப்புகளைச் சேமிப்பதற்கான கோப்பகத்தை ஸ்லாஷ்கள் கொண்ட பாதையாகக் குறிப்பிடலாம்:

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

ஆனால் POSIX என்று கருதுகிறது லாங் முன்னோக்கி சாய்வுடன் தொடங்கி, லோகேல் கோப்புகளுடன் கோப்பகங்களுக்கு முழுமையான பாதைகளை எழுதலாம், ஆனால் glibc в லினக்ஸ் அனைத்து பாதைகளும் அடிப்படை கோப்பகத்திலிருந்து கணக்கிடப்படுகின்றன, அவை மாறி மூலம் மேலெழுதப்படும் லோக்பாத். நிறுவிய பின் LOCPATH=~/.local/lib/locale/ உள்ளூர்மயமாக்கல் தொடர்பான அனைத்து கோப்புகளும் எனது கோப்புறையில் மட்டுமே தேடப்படும். மாறி தொகுப்பு கொண்ட இடங்களின் காப்பகம் லோக்பாத் புறக்கணிக்கப்பட்டது.

இங்கே தீர்க்கமான சோதனை:

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

ஹூரே! நாம் அதை செய்தோம்!

பிழைகள் வேலை

தொடக்கத்தில் எழுப்பப்பட்ட சரம் வரிசைப்படுத்துதல் பற்றிய கேள்விகளுக்கு நான் ஏற்கனவே பதிலளித்துள்ளேன், ஆனால் பிழைகள் பற்றி இன்னும் இரண்டு கேள்விகள் உள்ளன - தெரியும் மற்றும் கண்ணுக்கு தெரியாதவை.

அசல் பிரச்சனைக்கு திரும்புவோம்.

மற்றும் நிரல் வகையான மற்றும் நிரல் சேர இலிருந்து அதே சரம் ஒப்பீட்டு செயல்பாடுகளைப் பயன்படுத்தவும் glibc. அது எப்படி நடந்தது சேர கட்டளை மூலம் வரிசைப்படுத்தப்பட்ட வரிசைகளில் வரிசையாக்கப் பிழையைக் கொடுத்தது வகையான உள்ளூரில் en_US.UTF-8? பதில் எளிது: வகையான முழு சரத்தையும் ஒப்பிடுகிறது, மற்றும் சேர விசையை மட்டும் ஒப்பிடுகிறது, இது முன்னிருப்பாக சரத்தின் தொடக்கம் முதல் இடைவெளி எழுத்து வரை இருக்கும். எனது எடுத்துக்காட்டில், இது ஒரு பிழைச் செய்தியை ஏற்படுத்தியது, ஏனெனில் வரிகளில் உள்ள முதல் சொற்களின் வரிசைப்படுத்தல் முழு வரிகளின் வரிசைப்படுத்துதலுடன் பொருந்தவில்லை.

உள்ளூர் "சி" வரிசைப்படுத்தப்பட்ட சரங்களில் முதல் இடம் வரையிலான ஆரம்ப துணைச்சரங்களும் வரிசைப்படுத்தப்படும் என்று உத்தரவாதம் அளிக்கிறது, ஆனால் இது பிழையை மறைக்கிறது. பிழைச் செய்தி இல்லாமல், தவறான கோப்பு இணைப்பு முடிவைக் கொடுக்கும் தரவை (ஒரே குடும்பப்பெயர்கள், ஆனால் வெவ்வேறு பெயர்கள் கொண்டவர்கள்) தேர்ந்தெடுக்க முடியும். நாம் விரும்பினால் சேர கோப்பு வரிகளை முழுப் பெயரால் இணைத்த பிறகு, புலம் பிரிப்பானை வெளிப்படையாகக் குறிப்பிட்டு, முக்கிய புலத்தின் மூலம் வரிசைப்படுத்துவதே சரியான வழியாகும், முழு வரியால் அல்ல. இந்த வழக்கில், ஒன்றிணைப்பு சரியாக தொடரும் மற்றும் எந்த இடத்திலும் பிழைகள் இருக்காது:

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

குறியாக்கத்தில் உதாரணம் வெற்றிகரமாக செயல்படுத்தப்பட்டது CP1251 மற்றொரு பிழை உள்ளது. உண்மை என்னவென்றால், எனக்குத் தெரிந்த அனைத்து விநியோகங்களிலும் லினக்ஸ் தொகுப்புகள் தொகுக்கப்பட்ட மொழி இல்லை ru_RU.CP1251. தொகுக்கப்பட்ட இடம் கிடைக்கவில்லை என்றால், பிறகு வகையான பைட் பைட் ஒப்பீட்டை அமைதியாகப் பயன்படுத்துகிறோம், இதைத்தான் நாங்கள் கவனித்தோம்.

மூலம், தொகுக்கப்பட்ட இடங்களின் அணுக முடியாதது தொடர்பான மற்றொரு சிறிய தடுமாற்றம் உள்ளது. குழு LOCPATH=/tmp மொழி -a உள்ள அனைத்து இடங்களின் பட்டியலைக் கொடுக்கும் இடம்-காப்பகம், ஆனால் மாறி தொகுப்புடன் லோக்பாத் அனைத்து நிரல்களுக்கும் (மிகவும் உட்பட உள்ளூர்) இந்த இடங்கள் கிடைக்காது.

$> 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

முடிவுக்கு

நீங்கள் ஒரு புரோகிராமராக இருந்தால், சரங்கள் பைட்டுகளின் தொகுப்பு என்று நினைத்துப் பழகியிருந்தால், உங்கள் விருப்பம் LC_COLLATTE=C.

நீங்கள் ஒரு மொழியியலாளர் அல்லது அகராதி தொகுப்பாளராக இருந்தால், உங்கள் மொழியில் தொகுப்பது நல்லது.

நீங்கள் ஒரு எளிய பயனராக இருந்தால், கட்டளையை நீங்கள் பழக்கப்படுத்திக்கொள்ள வேண்டும் ls -a ஒரு புள்ளியுடன் தொடங்கும் கோப்புகளை ஒரு எழுத்தில் தொடங்கும் கோப்புகளுடன் கலந்து வெளியிடுகிறது நள்ளிரவு தளபதி, பெயர்களை வரிசைப்படுத்த அதன் உள் செயல்பாடுகளைப் பயன்படுத்தும், பட்டியலின் தொடக்கத்தில் ஒரு புள்ளியுடன் தொடங்கும் கோப்புகளை வைக்கிறது.

குறிப்புகள்

அறிக்கை எண். 10 யூனிகோட் தொகுப்பு அல்காரிதம்

unicode.org இல் எழுத்து எடைகள்

தீவிர சிகிச்சை பிரிவில் - ஐபிஎம்மில் இருந்து யூனிகோடுடன் பணிபுரியும் நூலகத்தை செயல்படுத்துதல்.

பயன்படுத்தி வரிசையாக்க சோதனை தீவிர சிகிச்சை பிரிவில்

எழுத்து எடைகள் ஐஎஸ்ஓ 14651

அளவுகோல்களுடன் கோப்பு வடிவத்தின் விளக்கம் ஐஎஸ்ஓ 14652

சரம் ஒப்பீடு பற்றிய விவாதம் glibc

ஆதாரம்: www.habr.com

கருத்தைச் சேர்