Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8

Yog tias koj yog tus tsim tawm thiab koj tau ntsib nrog txoj haujlwm ntawm kev xaiv qhov encoding, ces Unicode yuav luag ib txwm yog qhov kev daws teeb meem. Txoj kev sawv cev tshwj xeeb nyob ntawm cov ntsiab lus, tab sis feem ntau muaj cov lus teb thoob ntiaj teb ntawm no ib yam nkaus - UTF-8. Qhov zoo ntawm nws yog tias nws tso cai rau koj siv tag nrho cov cim Unicode yam tsis tau siv nyiaj ib yam nkaus ntau bytes hauv feem ntau. Muaj tseeb, rau cov lus uas siv ntau tshaj li cov tsiaj ntawv Latin, "tsis ntau dhau" yog tsawg kawg ob bytes ib tus cim. Peb puas tuaj yeem ua tau zoo dua yam tsis rov qab mus rau prehistoric encodings uas txwv peb tsuas yog 256 tus cim?

Hauv qab no kuv thov kom paub koj tus kheej nrog kuv sim teb cov lus nug no thiab ua raws li cov txheej txheem yooj yim uas tso cai rau koj khaws cov kab hauv ntau hom lus hauv ntiaj teb yam tsis tau ntxiv cov redundancy uas yog nyob rau hauv UTF-8.

Tsis lees paub. Kuv yuav tam sim ua ob peb qhov tshwj xeeb tseem ceeb: Cov kev daws teeb meem piav qhia tsis yog muab raws li kev hloov pauv thoob ntiaj teb rau UTF-8, nws tsuas yog tsim nyog nyob rau hauv cov npe nqaim (ntau dua ntawm lawv hauv qab), thiab tsis muaj qhov xwm txheej yuav tsum tau siv los cuam tshuam nrog APIs thib peb ( leej twg tsis paub txog nws). Feem ntau, lub hom phiaj compression algorithms (piv txwv li, deflate) yog qhov tsim nyog rau kev khaws cia ntawm cov ntaub ntawv loj loj. Tsis tas li ntawd, twb nyob rau hauv tus txheej txheem ntawm kev tsim kuv txoj kev daws teeb meem, kuv pom ib qho qauv uas twb muaj lawm hauv Unicode nws tus kheej, uas daws qhov teeb meem tib yam - nws yog qhov nyuaj me ntsis (thiab feem ntau zuj zus), tab sis nws tseem yog tus qauv lees paub, thiab tsis yog muab tso rau. ua ke ntawm lub hauv caug. Kuv mam qhia koj txog nws thiab.

Hais txog Unicode thiab UTF-8

Pib nrog, ob peb lo lus hais txog nws yog dab tsi Unicode ΠΈ UTF-8.

Raws li koj paub, 8-ntsis encodings siv los ua neeg nyiam. Nrog lawv, txhua yam yog yooj yim: 256 cov cim tuaj yeem suav nrog cov lej los ntawm 0 txog 255, thiab cov lej ntawm 0 txog 255 tuaj yeem pom tau tias yog ib byte. Yog tias peb rov qab mus rau qhov pib thaum pib, ASCII encoding yog tag nrho rau 7 cov khoom, yog li qhov tseem ceeb tshaj plaws hauv nws cov byte sawv cev yog xoom, thiab feem ntau 8-ntsis encodings tau sib xws nrog nws (lawv txawv tsuas yog nyob rau hauv "saum"). ib feem, qhov twg qhov tseem ceeb tshaj plaws yog ib qho).

Unicode txawv li cas ntawm cov encodings thiab yog vim li cas thiaj li muaj ntau tus neeg sawv cev tshwj xeeb cuam tshuam nrog nws - UTF-8, UTF-16 (BE thiab LE), UTF-32? Cia peb txheeb nws hauv kev txiav txim.

Tus qauv Unicode yooj yim piav qhia tsuas yog kev sib txuas lus ntawm cov cim (thiab qee zaum, tus kheej ntawm cov cim) thiab lawv cov lej. Thiab muaj ntau tus lej ua tau hauv tus qauv no - los ntawm 0x00 rau 0x10FFFF (1 daim). Yog tias peb xav muab tus lej hauv qhov ntau ntawm qhov sib txawv, tsis yog 114 lossis 112 bytes yuav txaus rau peb. Thiab txij li thaum peb cov processors tsis yog tsim los ua haujlwm nrog peb-byte tus lej, peb yuav raug yuam kom siv ntau li 1 bytes ib tus cim! Qhov no yog UTF-2, tab sis nws yog qhov tseeb vim qhov "khoom siv" uas hom ntawv no tsis nrov.

Hmoov zoo, qhov kev txiav txim ntawm cov cim hauv Unicode tsis yog random. Lawv tag nrho cov txheej tau muab faib ua 17 "dav hlau", txhua tus muaj 65536 (0x10000) "cov ntsiab lus code" Lub tswvyim ntawm "code point" ntawm no yog qhov yooj yim tus lej cim, muab rau nws los ntawm Unicode. Tab sis, raws li tau hais los saum toj no, hauv Unicode tsis yog tus lej ntawm tus kheej nkaus xwb, tab sis kuj tseem muaj lawv cov khoom thiab cov cim kev pabcuam (thiab qee zaum tsis muaj dab tsi cuam tshuam rau tus lej - tej zaum rau lub sijhawm, tab sis rau peb qhov no tsis tseem ceeb), yog li nws yog qhov tseeb dua ib txwm tham tshwj xeeb txog cov lej ntawm lawv tus kheej, thiab tsis yog cov cim. Txawm li cas los xij, hauv qab no, rau lub hom phiaj ntawm brevity, kuv yuav nquag siv lo lus "cim", txhais tau hais tias lo lus "code point".

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Unicode dav hlau. Raws li koj tuaj yeem pom, feem ntau ntawm nws (dav hlau 4 txog 13) tseem tsis tau siv.

Dab tsi yog qhov tseem ceeb tshaj plaws yog tias txhua lub ntsiab "pulp" nyob rau hauv lub dav hlau xoom, nws yog hu ua "Basic Multilingual Plane". Yog tias ib kab muaj cov ntawv sau ua ib hom lus niaj hnub no (xws li Suav), koj yuav tsis mus dhau lub dav hlau no. Tab sis koj tsis tuaj yeem txiav tag nrho ntawm Unicode ib qho - piv txwv li, emoji feem ntau nyob rau ntawm qhov kawg ntawm lub dav hlau tom ntej,"Ntxiv Multilingual Plane"(nws txuas ntxiv los ntawm 0x10000 rau 0x1FFFF). Yog li UTF-16 ua qhov no: tag nrho cov cim poob rau hauv Basic Multilingual Plane, yog encoded "raws li yog" nrog rau tus lej ob-byte sib raug. Txawm li cas los xij, qee tus lej hauv qhov ntau no tsis qhia cov cim tshwj xeeb txhua, tab sis qhia tias tom qab khub ntawm bytes no peb yuav tsum xav txog lwm tus - los ntawm kev sib txuas cov txiaj ntsig ntawm plaub bytes ua ke, peb tau txais tus lej uas suav nrog. tag nrho cov Unicode siv tau. Lub tswv yim no hu ua "surrogate khub niam txiv" - tej zaum koj yuav tau hnov ​​​​txog lawv.

Yog li UTF-16 xav tau ob lossis (hauv qhov tsawg heev) plaub bytes ib "code point". Qhov no zoo dua li siv plaub bytes txhua lub sijhawm, tab sis Latin (thiab lwm yam ASCII cim) thaum encoded txoj kev no nkim ib nrab ntawm qhov chaw ntawm xoom. UTF-8 yog tsim los kho qhov no: ASCII nyob rau hauv nws occupies, zoo li ua ntej, tsuas yog ib byte; cov cai los ntawm 0x80 rau 0x7FF - ob bytes; los ntawm 0x800 rau 0xFFFF - peb, thiab los ntawm 0x10000 rau 0x10FFFF - plaub. Ntawm qhov tod tes, cov tsiaj ntawv Latin tau dhau los ua qhov zoo: kev sib raug zoo nrog ASCII tau rov qab los, thiab kev faib tawm ntau dua "kho tawm" los ntawm 1 txog 4 bytes. Tab sis cov tsiaj ntawv uas tsis yog Latin, alas, tsis muaj txiaj ntsig zoo li cas piv rau UTF-16, thiab ntau tam sim no xav tau peb bytes es tsis txhob ntawm ob - qhov ntau them los ntawm ob-byte cov ntaub ntawv tau nqaim los ntawm 32 zaug, nrog 0xFFFF rau 0x7FF, thiab tsis suav Suav lossis, piv txwv li, Georgian suav nrog. Cyrillic thiab tsib lwm cov tsiaj ntawv - hurray - muaj hmoo, 2 bytes ib tus cim.

Vim li cas qhov no tshwm sim? Wb saib li cas UTF-8 sawv cev rau cov cim cim:
Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Ncaj nraim los sawv cev rau tus lej, cov khoom cim nrog lub cim yog siv ntawm no x. Nws tuaj yeem pom tias hauv ob-byte cov ntaub ntawv tsuas muaj 11 cov khoom no xwb (tawm ntawm 16). Cov khoom tseem ceeb ntawm no tsuas muaj kev pab cuam nkaus xwb. Nyob rau hauv cov ntaub ntawv ntawm plaub-byte cov ntaub ntawv, 21 ntawm 32 cov khoom raug faib rau tus lej point code - nws yuav zoo li tias peb bytes (uas muab tag nrho ntawm 24 khoom) yuav txaus, tab sis cov cim kev pabcuam noj ntau dhau.

Qhov no puas phem? Tsis yog tiag. Ntawm qhov tod tes, yog tias peb mob siab rau ntau qhov chaw, peb muaj compression algorithms uas tuaj yeem tshem tawm tag nrho cov ntxiv entropy thiab redundancy. Ntawm qhov tod tes, lub hom phiaj ntawm Unicode yog los muab qhov kev coding thoob ntiaj teb tshaj plaws. Piv txwv li, peb tuaj yeem tso siab rau ib kab encoded hauv UTF-8 rau code uas yav dhau los ua haujlwm nrog ASCII nkaus xwb, thiab tsis txhob ntshai tias nws yuav pom tus cwj pwm los ntawm ASCII ntau yam uas tsis muaj tseeb (tom qab tag nrho, hauv UTF-8 tag nrho. bytes pib nrog los ntawm xoom ntsis - qhov no yog raws nraim li ASCII yog). Thiab yog hais tias peb mam li nco dheev xav txiav tawm ib tug me me tus Tsov tus tw los ntawm ib tug loj txoj hlua yam tsis tau txiav txim siab los ntawm qhov pib (los yog rov qab ib feem ntawm cov ntaub ntawv tom qab ib tug puas seem), nws yog ib qho yooj yim rau peb mus nrhiav tau qhov offset qhov twg ib tug cim pib (nws yog txaus. hla bytes uas muaj me ntsis prefix 10).

Vim li cas thiaj li tsim ib yam tshiab?

Nyob rau tib lub sijhawm, muaj qee zaus thaum compression algorithms zoo li deflate tsis zoo siv, tab sis koj xav ua kom tiav cov hlua khi. Tus kheej, kuv ntsib qhov teeb meem no thaum xav txog kev tsim tsev compressed prefix ntoo rau phau ntawv txhais lus loj nrog rau cov lus hauv cov lus tsis txaus ntseeg. Ntawm ib sab, txhua lo lus luv heev, yog li compressing nws yuav tsis muaj txiaj ntsig. Ntawm qhov tod tes, tsob ntoo kev siv uas kuv xav tias yog tsim los kom txhua byte ntawm cov hlua khaws cia tau tsim ib tsob ntoo vertex, yog li txo lawv tus lej yog qhov tseem ceeb heev. Hauv kuv lub tsev qiv ntawv Az.js (Raws li hauv pymorphy 2, uas nws yog raws li) ib qho teeb meem zoo sib xws tuaj yeem daws tau yooj yim - cov hlua ntim rau hauv DAWG-dictionary, khaws cia rau hauv zoo qub CP1251. Tab sis, raws li qhov yooj yim to taub, qhov no ua haujlwm zoo rau cov tsiaj ntawv tsawg - ib kab hauv Suav tsis tuaj yeem muab ntxiv rau hauv phau ntawv txhais lus.

Cais, kuv xav sau ib qho kev tsis txaus siab ntxiv uas tshwm sim thaum siv UTF-8 hauv cov ntaub ntawv zoo li no. Daim duab saum toj no qhia tau hais tias thaum ib tus cim sau ua ob bytes, cov khoom cuam tshuam nrog nws tus lej tsis tuaj yeem ua ke, tab sis sib cais los ntawm ib khub ntawm cov khoom. 10 hauv nruab nrab: 110xxxxx 10xxxxxx. Vim li no, thaum qis dua 6 khoom ntawm ob byte overflow hauv cov cim code (piv txwv li, kev hloov pauv tshwm sim. 10111111 β†’ 10000000), ces thawj byte hloov ib yam nkaus. Nws hloov tawm tias tsab ntawv "p" yog txhais los ntawm bytes 0xD0 0xBF, thiab tom ntej no "r" yog lawm 0xD1 0x80. Nyob rau hauv ib tsob ntoo ua ntej, qhov no ua rau kev sib cais ntawm niam txiv node ua ob - ib qho rau lub npe ua ntej. 0xD0, thiab lwm yam rau 0xD1 (txawm hais tias tag nrho cov tsiaj ntawv Cyrillic tuaj yeem raug encoded los ntawm ob byte).

Kuv tau txais dab tsi

Tau ntsib qhov teeb meem no, kuv txiav txim siab los xyaum ua si nrog cov khoom, thiab tib lub sijhawm tau txais kev paub zoo me ntsis nrog cov qauv ntawm Unicode tag nrho. Qhov tshwm sim yog UTF-C encoding hom ntawv ("C" rau compact), uas siv tsis pub ntau tshaj 3 bytes ib code point, thiab feem ntau tso cai rau koj siv xwb ib byte ntxiv rau tag nrho cov kab encoded. Qhov no ua rau qhov tseeb tias ntawm ntau cov tsiaj ntawv uas tsis yog ASCII xws li encoding hloov mus ua 30-60% ntau compact dua UTF-8.

Kuv tau nthuav tawm cov piv txwv ntawm kev siv encoding thiab decoding algorithms hauv daim ntawv JavaScript thiab Go cov tsev qiv ntawv, koj tuaj yeem siv lawv dawb hauv koj cov cai. Tab sis kuv tseem yuav hais ntxiv tias nyob rau hauv kev txiav txim siab hom ntawv no tseem yog "tsheb kauj vab", thiab kuv tsis pom zoo siv nws tsis paub vim li cas koj xav tau. Qhov no tseem yog qhov kev sim ntau dua li qhov loj "kev txhim kho ntawm UTF-8". Txawm li cas los xij, cov cai muaj yog sau zoo zoo, concisely, nrog ntau cov lus pom thiab kev ntsuam xyuas.

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Cov qhabnias xeem thiab sib piv nrog UTF-8

kuv kuj tau ua paj demo, qhov twg koj tuaj yeem ntsuas qhov kev ua tau zoo ntawm cov algorithm, thiab tom qab ntawd kuv yuav qhia koj ntxiv txog nws cov hauv paus ntsiab lus thiab kev txhim kho.

Tshem tawm cov khoom siv tsis tu ncua

Kuv coj UTF-8 ua lub hauv paus, tau kawg. Thawj thiab pom tseeb tshaj plaws uas tuaj yeem hloov pauv hauv nws yog txo qis cov kev pabcuam hauv txhua byte. Piv txwv li, thawj byte hauv UTF-8 ib txwm pib nrog ib qho 0, sau nrog 11 - ib prefix 10 Tsuas yog cov hauv qab no bytes muaj nws. Cia peb hloov lub prefix 11 rau 1, thiab rau tom ntej bytes peb yuav tshem tawm cov prefixes tag. Yuav ua li cas?

0xxxxxxx β€” 1 byte ib
10xxxxxx xxxxxxxx - 2 bytes
110xxxxx xxxxxxxx xxxxxxxx - 3 bytes

Tos, cov ntaub ntawv plaub-byte nyob qhov twg? Tab sis nws tsis xav tau ntxiv lawm - thaum sau hauv peb bytes, tam sim no peb muaj 21 khoom muaj thiab qhov no txaus rau txhua tus lej mus txog 0x10FFFF.

Peb tau txi dab tsi ntawm no? Qhov tseem ceeb tshaj plaws yog qhov nrhiav tau ntawm tus cim ciam teb los ntawm qhov chaw nyob hauv qhov tsis sib xws. Peb tsis tuaj yeem taw tes rau ntawm qhov tsis txaus ntseeg byte thiab nrhiav qhov pib ntawm tus cim tom ntej los ntawm nws. Qhov no yog qhov txwv ntawm peb hom, tab sis hauv kev xyaum, qhov no tsis tshua tsim nyog. Peb feem ntau muaj peev xwm khiav tau los ntawm qhov tsis tau los ntawm qhov pib (tshwj xeeb tshaj yog thaum nws los txog rau cov kab luv).

Qhov xwm txheej nrog cov lus npog nrog 2 bytes kuj tau zoo dua: tam sim no cov hom ntawv ob-byte muab ntau yam ntawm 14 khoom, thiab cov no yog cov lej mus txog. 0x3FFF. Suav tsis muaj hmoo (lawv cov cim feem ntau yog los ntawm 0x4E00 rau 0x9FFF), tab sis Georgians thiab ntau lwm haiv neeg muaj kev lom zem ntau dua - lawv cov lus kuj haum rau 2 bytes ib tus cwj pwm.

Nkag mus rau lub xeev encoder

Cia peb xav txog cov khoom ntawm cov kab lawv tus kheej. Phau ntawv txhais lus feem ntau muaj cov lus sau ua cov cim ntawm tib cov tsiaj ntawv, thiab qhov no kuj muaj tseeb rau ntau lwm cov ntawv. Nws yuav zoo los qhia cov tsiaj ntawv no ib zaug, thiab tom qab ntawd qhia tsuas yog tus lej ntawm tsab ntawv hauv nws. Cia saib seb qhov kev npaj ntawm cov cim hauv lub rooj Unicode puas yuav pab tau peb.

Raws li tau hais los saum no, Unicode tau muab faib ua dav hlau 65536 ib. Tab sis qhov no tsis yog qhov muaj txiaj ntsig zoo (raws li twb tau hais lawm, feem ntau peb nyob hauv lub dav hlau xoom). Ntau nthuav yog kev faib los ntawm thaiv. Cov kab no tsis muaj qhov ntev ntev, thiab muaj txiaj ntsig ntau dua - raws li txoj cai, txhua tus sib txuas cov cim los ntawm tib cov tsiaj ntawv.

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Ib qho thaiv uas muaj cov cim ntawm cov tsiaj ntawv Bengali. Hmoov tsis zoo, rau cov laj thawj keeb kwm, qhov no yog ib qho piv txwv ntawm cov ntim tsis nruj heev - 96 cov cim tau tawg mus thoob plaws 128 thaiv cov ntsiab lus.

Qhov pib ntawm cov blocks thiab lawv qhov ntau thiab tsawg yog ib txwm sib npaug ntawm 16 - qhov no tsuas yog ua kom yooj yim. Tsis tas li ntawd, ntau cov blocks pib thiab xaus rau qhov tseem ceeb uas yog qhov sib npaug ntawm 128 lossis txawm tias 256 - piv txwv li, cov tsiaj ntawv Cyrillic pib siv 256 bytes los ntawm 0x0400 rau 0x04FF. Qhov no yooj yim heev: yog tias peb khaws cov ntawv ua ntej ib zaug 0x04, ces txhua tus Cyrillic cim tuaj yeem sau rau hauv ib byte. Muaj tseeb, txoj hauv kev no peb yuav plam lub sijhawm rov qab mus rau ASCII (thiab rau lwm cov cim feem ntau). Yog li ntawd peb ua qhov no:

  1. Ob bytes 10yyyyyy yxxxxxxx tsis tsuas yog qhia lub cim nrog tus lej yyyyyy yxxxxxxx, tab sis kuj hloov cov tsiaj ntawv tam sim no rau yyyyyy y0000000 (piv txwv li peb nco ntsoov tag nrho cov khoom tshwj tsis yog qhov tseem ceeb tshaj plaws 7 ntsis);
  2. Ib byte 0xxxxxxx qhov no yog tus cwj pwm ntawm cov tsiaj ntawv tam sim no. Nws tsuas yog yuav tsum tau ntxiv rau qhov offset uas peb nco qab hauv kauj ruam 1. Thaum peb tsis hloov cov tsiaj ntawv, qhov offset yog xoom, yog li peb khaws kev sib raug zoo nrog ASCII.

Ib yam li ntawd rau cov lej xav tau 3 bytes:

  1. Peb bytes 110yyyyy yxxxxxxx xxxxxxxx qhia ib lub cim nrog tus lej yyyyyy yxxxxxxx xxxxxxxx, hloov cov tsiaj ntawv tam sim no rau yyyyyy y0000000 00000000 (nco txhua yam tsuas yog cov hluas xwb 15 ntsis), thiab kos lub thawv uas peb nyob tam sim no ntev hom (thaum hloov cov tsiaj ntawv rov qab mus rau ob-byte ib, peb yuav rov pib dua tus chij no);
  2. Ob bytes 0xxxxxxx xxxxxxxx nyob rau hauv hom ntev nws yog tus cwj pwm ntawm cov tsiaj ntawv tam sim no. Ib yam li ntawd, peb ntxiv nws nrog cov offset los ntawm kauj ruam 1. Qhov txawv tsuas yog tias tam sim no peb nyeem ob bytes (vim peb hloov mus rau hom no).

Suab zoo: tam sim no thaum peb xav tau encode cov cim los ntawm tib 7-ntsis Unicode ntau yam, peb siv 1 byte ntxiv thaum pib thiab tag nrho ntawm ib byte ib tus cim.

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Ua hauj lwm los ntawm ib qho ntawm cov ua ntej versions. Nws twb nquag ntaus UTF-8, tab sis tseem muaj chaw rau kev txhim kho.

Dab tsi yog qhov phem dua? Ua ntej, peb muaj ib tug mob, uas yog cov tsiaj ntawv tam sim no offset thiab checkbox ntev hom. Qhov no txwv peb ntxiv: tam sim no tib cov cim tuaj yeem hloov pauv sib txawv hauv cov ntsiab lus sib txawv. Kev tshawb nrhiav substrings, piv txwv li, yuav tsum tau ua qhov no rau hauv tus account, thiab tsis yog los ntawm kev sib piv bytes xwb. Thib ob, sai li sai tau thaum peb hloov cov tsiaj ntawv, nws tau dhau los ua qhov tsis zoo nrog cov cim ntawm ASCII (thiab qhov no tsis yog cov tsiaj ntawv Latin nkaus xwb, tab sis kuj tseem muaj cov cim cim, suav nrog qhov chaw) - lawv yuav tsum hloov cov tsiaj ntawv dua rau 0, uas yog, dua ib qho ntxiv byte (thiab tom qab ntawd ib qho kom rov qab mus rau peb lub ntsiab lus tseem ceeb).

Ib tug tsiaj ntawv zoo, ob yog zoo

Cia peb sim hloov peb cov lus ua ntej me ntsis, nyem rau hauv ib qho ntxiv rau peb qhov tau piav qhia saum toj no:

0xxxxxxx - 1 byte hauv hom qub, 2 hauv hom ntev
11xxxxxx β€” 1 byte ib
100xxxxx xxxxxxxx - 2 bytes
101xxxxx xxxxxxxx xxxxxxxx - 3 bytes

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8

Tam sim no nyob rau hauv ib tug ob-byte cov ntaub ntawv muaj ib tug tsawg muaj me ntsis - code ntsiab lus mus txog 0x1FFFthiab tsis 0x3FFF. Txawm li cas los xij, nws tseem ceeb dua qhov loj dua hauv ob-byte UTF-8 cov lej, cov lus siv feem ntau tseem haum rau, qhov pom pom tshaj plaws tau poob tawm. hiragana ΠΈ kev, cov Japanese tu siab heev.

Txoj cai tshiab no yog dab tsi? 11xxxxxx? Qhov no yog ib qho me me "stash" ntawm 64 tus cim loj, nws ua tiav peb cov tsiaj ntawv loj, yog li kuv hu nws pab (pabcuam) cov tsiaj ntawv. Thaum peb hloov cov tsiaj ntawv tam sim no, ib daim ntawm cov tsiaj ntawv qub dhau los ua pab. Piv txwv li, peb hloov los ntawm ASCII mus rau Cyrillic - lub stash tam sim no muaj 64 cov cim Cov tsiaj ntawv Latin, cov lej, qhov chaw thiab cim cim (feem ntau cov lus ntxig hauv cov ntawv tsis yog ASCII). Hloov rov qab mus rau ASCII - thiab qhov tseem ceeb ntawm cov tsiaj ntawv Cyrillic yuav dhau los ua cov tsiaj ntawv pabcuam.

Ua tsaug rau kev nkag mus rau ob tus tsiaj ntawv, peb tuaj yeem lis ntau cov ntawv nrog tus nqi tsawg heev rau kev hloov cov tsiaj ntawv (cov ntawv sau feem ntau yuav ua rau rov qab mus rau ASCII, tab sis tom qab ntawd peb yuav tau txais ntau yam tsis yog ASCII los ntawm cov tsiaj ntawv ntxiv, tsis muaj. hloov dua).

Nyiaj tshwj xeeb: prefixing sub-niam ntawv 11xxxxxx thiab xaiv nws thawj offset yuav 0xC0, peb tau txais ib feem compatibility nrog CP1252. Hauv lwm lo lus, ntau (tab sis tsis yog tag nrho) Western European cov ntawv sau hauv CP1252 yuav zoo ib yam hauv UTF-C.

Ntawm no, txawm li cas los xij, qhov teeb meem tshwm sim: yuav ua li cas kom tau txais ib qho kev pabcuam los ntawm cov tsiaj ntawv loj? Koj tuaj yeem tawm tib qho offset, tab sis - alas - ntawm no tus qauv Unicode twb ua si tawm tsam peb. Feem ntau lub ntsiab ntawm cov tsiaj ntawv tsis yog thaum pib ntawm lub block (piv txwv li, Lavxias teb sab capital "A" muaj cov cai. 0x0410, txawm hais tias Cyrillic block pib nrog 0x0400). Yog li, tau coj thawj 64 tus cim rau hauv qhov chaw khaws cia, peb yuav poob kev nkag mus rau tus Tsov tus tw ntawm cov tsiaj ntawv.

Txhawm rau txhim kho qhov teeb meem no, kuv tus kheej tau mus dhau qee cov blocks sib xws rau cov lus sib txawv, thiab tau teev cov offset ntawm cov tsiaj ntawv pabcuam hauv lub ntsiab rau lawv. Cov tsiaj ntawv Latin, raws li kev zam, feem ntau tau hloov dua tshiab zoo li base64.

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8

Thaum kawg kov

Thaum kawg peb xav txog qhov twg peb tuaj yeem txhim kho qee yam.

Nco ntsoov tias hom ntawv 101xxxxx xxxxxxxx xxxxxxxx tso cai rau koj mus encode tus lej mus txog 0x1FFFFF, thiab Unicode xaus ua ntej, ntawm 0x10FFFF. Hauv lwm lo lus, qhov kawg code point yuav raug sawv cev li 10110000 11111111 11111111. Yog li ntawd, peb tuaj yeem hais tias yog thawj byte yog ntawm daim ntawv 1011xxxx (qhov twg xxxx ntau dua 0), ces nws txhais tau tias lwm yam. Piv txwv li, koj tuaj yeem ntxiv lwm 15 tus cim nyob ntawd uas niaj hnub muaj rau encoding hauv ib byte, tab sis kuv txiav txim siab ua nws txawv.

Cia peb saib cov blocks Unicode uas xav tau peb bytes tam sim no. Yeej, raws li twb tau hais lawm, cov no yog cov cim Suav - tab sis nws nyuaj ua dab tsi nrog lawv, muaj 21 txhiab ntawm lawv. Tab sis hiragana thiab katakana kuj ya mus rau ntawd - thiab tsis muaj ntau ntawm lawv ntxiv lawm, tsawg dua ob puas. Thiab, txij li thaum peb nco txog cov neeg Nyij Pooj, kuj tseem muaj emojis (qhov tseeb, lawv tau tawg mus rau ntau qhov chaw hauv Unicode, tab sis cov blocks tseem ceeb nyob hauv ntau yam. 0x1F300 - 0x1FBFF). Yog tias koj xav txog qhov tseeb tias tam sim no muaj emojis uas tau sib sau los ntawm ntau lub ntsiab lus hauv ib zaug (piv txwv li, emojis.Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8 muaj ntau npaum li 7 tus lej!), tom qab ntawd nws dhau los ua kev txaj muag tag los siv peb bytes ntawm txhua tus (7 Γ— 3 = 21 bytes rau lub hom phiaj ntawm ib lub cim, npau suav phem).

Yog li ntawd, peb xaiv ob peb qhov kev xaiv uas cuam tshuam rau emoji, hiragana thiab katakana, hloov lawv mus rau hauv ib daim ntawv txuas ntxiv thiab encode lawv li ob bytes tsis yog peb:

1011xxxx xxxxxxxx

Zoo heev: lub emoji tau hais tsegLwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8, suav nrog 7 cov ntsiab lus code, siv 8 bytes hauv UTF-25, thiab peb haum rau nws 14 (tsuas yog ob bytes rau txhua tus lej taw tes). Los ntawm txoj kev, Habr tsis kam zom nws (ob qho tib si hauv cov laus thiab hauv cov neeg kho tshiab), yog li kuv yuav tsum tau ntxig nws nrog ib daim duab.

Cia peb sim kho ib qho teeb meem ntxiv. Raws li peb nco ntsoov, cov tsiaj ntawv yooj yim yog qhov tseem ceeb heev 6bit, uas peb khaws cia rau hauv lub siab thiab nplaum rau cov cai ntawm txhua tus tom ntej decoded cim. Nyob rau hauv cov ntaub ntawv ntawm Suav cim uas nyob rau hauv lub block 0x4E00 - 0x9FFF, qhov no yog me ntsis 0 lossis 1. Qhov no tsis yooj yim heev: peb yuav tsum tau hloov cov tsiaj ntawv tas li ntawm ob qhov tseem ceeb (piv txwv li siv peb bytes). Tab sis nco ntsoov tias nyob rau hauv hom ntev, los ntawm tus lej nws tus kheej peb tuaj yeem rho tawm tus lej ntawm cov cim uas peb encode siv hom luv luv (tom qab tag nrho cov lus piav qhia saum toj no, qhov no yog 10240) - tom qab ntawd qhov ntau ntawm hieroglyphs yuav hloov mus rau. 0x2600 - 0x77FF, thiab nyob rau hauv cov ntaub ntawv no, nyob rau hauv tag nrho cov ntau yam, qhov tseem ceeb tshaj plaws 6 khoom (tawm ntawm 21) yuav muab sib npaug rau 0. Yog li, sequences ntawm hieroglyphs yuav siv ob bytes ib hieroglyph (uas yog qhov zoo rau xws li ib tug loj ntau yam), tsis muaj. ua rau cov tsiaj ntawv hloov.

Lwm txoj kev daws teeb meem: SCSU, BOCU-1

Cov kws paub txog Unicode, tsuas yog nyeem lub npe ntawm tsab xov xwm, feem ntau yuav nrawm nrawm los ceeb toom koj tias ncaj qha ntawm cov qauv Unicode muaj. Standard Compression Scheme rau Unicode (SCSU), uas piav qhia txog tus txheej txheem encoding zoo ib yam li tau piav qhia hauv kab lus.

Kuv lees paub ncaj ncees: Kuv kawm txog nws lub neej tsuas yog tom qab kuv tau nkag siab tob rau hauv kev sau kuv qhov kev txiav txim siab. Yog tias kuv paub txog nws los ntawm qhov pib, tej zaum kuv yuav tau sim sau ib qho kev siv es tsis txhob tuaj nrog kuv tus kheej mus kom ze.

Qhov nthuav yog tias SCSU siv cov tswv yim zoo ib yam li cov uas kuv tau los ntawm kuv tus kheej (tsis yog lub tswv yim ntawm "cov tsiaj ntawv" lawv siv "qhov rais", thiab muaj ntau dua li kuv muaj). Nyob rau tib lub sijhawm, hom ntawv no kuj muaj qhov tsis zoo: nws yog me ntsis ze rau compression algorithms dua li encoding sawv daws yuav. Hauv particular, tus qauv muab ntau txoj kev sawv cev, tab sis tsis tau hais tias yuav xaiv qhov zoo tshaj plaws li cas - rau qhov no, tus encoder yuav tsum siv qee yam ntawm heuristics. Yog li, SCSU encoder uas tsim cov ntim khoom zoo yuav yog qhov nyuaj thiab nyuaj dua li kuv cov algorithm.

Rau kev sib piv, kuv tau hloov qhov kev siv yooj yim ntawm SCSU rau JavaScript - hais txog cov lej ntim nws tau muab piv rau kuv UTF-C, tab sis qee zaum qhov tshwm sim yog kaum feem pua ​​​​mob (qee zaum nws yuav dhau nws, tab sis. tsis ntau). Piv txwv li, cov ntawv hauv Hebrew thiab Greek tau encoded los ntawm UTF-C 60% zoo dua SCSU (tej zaum yog vim lawv cov tsiaj ntawv compact).

Cais, kuv yuav ntxiv tias ntxiv rau SCSU kuj tseem muaj lwm txoj hauv kev los ua tus sawv cev ntawm Unicode - BOCU-1, tab sis nws tsom rau MIME kev sib raug zoo (uas kuv tsis xav tau) thiab siv txoj hauv kev sib txawv me ntsis rau kev encoding. Kuv tsis tau ntsuas nws cov txiaj ntsig, tab sis nws zoo li kuv tias nws tsis zoo li siab dua SCSU.

Muaj peev xwm txhim kho

Cov algorithm kuv tau nthuav tawm tsis yog thoob ntiaj teb los ntawm kev tsim qauv (qhov no yog qhov uas kuv lub hom phiaj sib txawv feem ntau ntawm cov hom phiaj ntawm Unicode Consortium). Kuv twb tau hais tias nws tau tsim los ua haujlwm rau ib txoj haujlwm ( khaws cia ntau hom lus phau ntawv txhais lus hauv ib tsob ntoo ua ntej), thiab qee qhov ntawm nws cov yam ntxwv yuav tsis haum rau lwm yam haujlwm. Tab sis qhov tseeb tias nws tsis yog tus qauv tuaj yeem yog qhov ntxiv - koj tuaj yeem hloov kho tau yooj yim kom haum koj cov kev xav tau.

Piv txwv li, nyob rau hauv txoj kev pom tseeb koj tuaj yeem tshem tawm ntawm lub xub ntiag ntawm lub xeev, ua stateless coding - tsuas yog tsis hloov pauv hloov pauv. offs, auxOffs ΠΈ is21Bit nyob rau hauv lub encoder thiab decoder. Hauv qhov no, nws yuav tsis tuaj yeem ua tau zoo ntim cov cim ntawm tib cov tsiaj ntawv, tab sis yuav muaj kev lees paub tias tib tus cwj pwm yeej ib txwm encoded nrog tib bytes, tsis hais cov ntsiab lus twg.

Tsis tas li ntawd, koj tuaj yeem hloov kho lub encoder rau ib hom lus tshwj xeeb los ntawm kev hloov lub neej ntawd - piv txwv li, tsom rau cov ntawv Lavxias, teeb tsa lub encoder thiab decoder thaum pib. offs = 0x0400 ΠΈ auxOffs = 0. Qhov no tshwj xeeb tshaj yog ua rau kev txiav txim siab nyob rau hauv rooj plaub ntawm hom tsis muaj neeg nyob. Feem ntau, qhov no yuav zoo ib yam li siv cov laus yim-ntsis encoding, tab sis tsis tshem tawm lub peev xwm los ntxig cov cim ntawm tag nrho Unicode raws li xav tau.

Lwm qhov tsis zoo uas tau hais ua ntej yog tias nyob rau hauv cov ntawv loj encoded hauv UTF-C tsis muaj txoj hauv kev yooj yim los nrhiav tus cim ciam teb ze tshaj plaws rau ib qho byte arbitrary. Yog tias koj txiav tawm qhov kawg, hais tias, 100 bytes los ntawm qhov tsis muaj encoded, koj pheej hmoo tau cov khib nyiab uas koj ua tsis tau dab tsi nrog. Lub encoding tsis yog tsim los khaws cia ntau-gigabyte cav, tab sis feem ntau qhov no tuaj yeem kho. Byte 0xBF yuav tsum tsis txhob tshwm sim thawj byte (tab sis tej zaum yuav yog qhov thib ob lossis thib peb). Yog li ntawd, thaum encoding, koj tuaj yeem ntxig qhov sib lawv liag 0xBF 0xBF 0xBF txhua, hais, 10 KB - tom qab ntawd, yog tias koj xav nrhiav ib thaj tsam, nws yuav txaus los luam theej duab xaiv kom txog thaum pom cov cim zoo sib xws. Ua raws li qhov kawg 0xBF tau lees tias yuav yog qhov pib ntawm tus cwj pwm. (Thaum kev txiav txim siab, qhov sib lawv liag ntawm peb bytes yuav, tau kawg, yuav tsum tsis quav ntsej.)

Summing txog

Yog tias koj tau nyeem tam sim no, zoo siab nrog! Kuv vam tias koj, zoo li kuv, tau kawm qee yam tshiab (lossis kho koj lub cim xeeb) txog cov qauv ntawm Unicode.

Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8
Nplooj ntawv Demo. Qhov piv txwv ntawm Hebrew qhia qhov zoo ntawm UTF-8 thiab SCSU.

Cov kev tshawb fawb saum toj no yuav tsum tsis txhob suav tias yog kev ua txhaum ntawm cov qauv. Txawm li cas los xij, feem ntau kuv txaus siab rau cov txiaj ntsig ntawm kuv txoj haujlwm, yog li kuv zoo siab nrog lawv qhia: Piv txwv li, ib lub tsev qiv ntawv JS tsawg tsuas yog 1710 bytes (thiab tsis muaj kev vam khom, tau kawg). Raws li kuv tau hais los saum no, nws txoj haujlwm tuaj yeem nrhiav tau ntawm paj demo (tseem muaj ib txheej ntawm cov ntawv uas nws tuaj yeem muab piv nrog UTF-8 thiab SCSU).

Thaum kawg, kuv yuav rov hais dua rau cov xwm txheej uas siv UTF-C tsis tsim nyog nws:

  • Yog tias koj cov kab ntev txaus (los ntawm 100-200 cim). Hauv qhov no, koj yuav tsum xav txog kev siv compression algorithms zoo li deflate.
  • Yog koj xav tau ASCII pob tshab, uas yog, nws yog ib qho tseem ceeb rau koj tias cov txheej txheem encoded tsis muaj cov lej ASCII uas tsis nyob hauv cov hlua qub. Qhov kev xav tau ntawm qhov no tuaj yeem zam tau yog tias, thaum cuam tshuam nrog cov neeg thib peb APIs (piv txwv li, ua haujlwm nrog cov ntaub ntawv), koj dhau qhov txiaj ntsig encoding raws li kev paub daws teeb ntawm bytes, thiab tsis yog cov hlua. Tsis tas li ntawd, koj yuav muaj kev pheej hmoo tau txais qhov tsis txaus ntseeg.
  • Yog tias koj xav tau sai sai nrhiav cov cim ciam teb ntawm qhov tsis txaus ntseeg (piv txwv li, thaum ib feem ntawm kab puas). Qhov no tuaj yeem ua tiav, tab sis tsuas yog los ntawm kev txheeb xyuas kab los ntawm qhov pib (lossis siv qhov kev hloov kho tau piav qhia hauv ntu dhau los).
  • Yog tias koj xav tau kev ua haujlwm sai sai ntawm cov ntsiab lus ntawm cov hlua (tso lawv, tshawb nrhiav cov hlua hauv lawv, sib txuas). Qhov no yuav tsum tau cov hlua kom txiav txim siab ua ntej, yog li UTF-C yuav qeeb dua UTF-8 nyob rau hauv cov ntaub ntawv no (tab sis ceev tshaj compression algorithms). Txij li thaum tib txoj hlua yog ib txwm encoded tib txoj kev, qhov sib piv ntawm kev txiav txim siab tsis tas yuav tsum tau thiab tuaj yeem ua tiav ntawm byte-by-byte.

hloov tshiab: tus neeg siv Tyomitch hauv cov lus hauv qab no tshaj tawm ib daim duab qhia txog qhov kev txwv ntawm UTF-C. Nws qhia tau hais tias UTF-C muaj txiaj ntsig zoo dua li qhov kev ua haujlwm dav dav dav dav (kev hloov pauv ntawm LZW) tsuav yog cov hlua ntim luv dua. ~ 140 cim (Txawm li cas los xij, kuv nco ntsoov tias qhov sib piv tau ua tiav ntawm ib phau ntawv; rau lwm yam lus, qhov tshwm sim yuav txawv).
Lwm lub tsheb kauj vab: peb khaws cov hlua Unicode 30-60% ntau dua li UTF-8

Tau qhov twg los: www.hab.com

Ntxiv ib saib