Decoder unicode: HTML Decode or Encode — Online Toolz
Unicode, Hexadecimal, Decimal NCR, UTF-8 Converter — EndMemo
Escaped Unicode, Decimal NCRs, Hexadecimal NCRs, UTF-8 Converter
(Input or paste unicode, hex, utf-8 to their related input box, and then click the related calculate button will do the
conversion. Conversion in paragraphs is supported. Click the symbols below to check their values in all forms for quick reference.)
π | ° | Π | Δ | µ | Ω | × | χ | ∑ | ± | √ |
∞ | ® | € | Φ | φ | © | § | * | × | ̊ | α |
α | β | γ | δ | ε | ζ | η | θ | ι | κ | λ |
μ | ν | ξ | ο | π | ρ | ς | σ | τ | υ | φ |
More symbols can be found further below
Search Unicode by name:
Unicode Symbol Lists
π | ° | Π | Δ | µ | Ω | × | χ | ∑ | ± | √ |
∞ | ® | € | Φ | φ | © | § | * | × | ̊ | α |
α | β | γ | δ | ε | ζ | η | θ | ι | κ | λ |
μ | ν | ξ | ο | π | ρ | ς | σ | τ | υ | φ |
χ | ψ | ω | Α | Β | Γ | Δ | Ε | Ζ | Η | Θ |
Ι | Κ | Λ | Μ | Ν | Ξ | Ο | ‰ | • | – | — |
― | ‘ | ’ | ‚ | “ | ” | „ | † | ‡ | … | ‹ |
› | ‽ | ⁄ | ⁰ | ⁴ | ⁵ | ⁶ | ⁷ | ⁸ | ⁹ | ⁺ |
⁻ | ⁼ | ⁽ | ⁾ | ⁿ | ₀ | ₁ | ₂ | ₃ | ₄ | ₅ |
₆ | ₇ | ₈ | ₉ | ₊ | ₋ | ₌ | ₍ | ₎ | ₀ | ℓ |
№ | ℗ | ℠ | ™ | ℮ | ⅓ | ⅔ | ⅕ | ⅖ | ⅗ | ⅘ |
⅙ | ⅚ | ⅛ | ⅜ | ⅝ | ⅞ | ⅟ | ⅓ | ⅓ | ← | ↑ |
→ | ↓ | ↔ | ↕ | ↖ | ↗ | ↘ | ↙ | ∂ | ∙ | ≈ |
≠ | ≤ | ≥ | ◊ | ! | « | # | $ | % | & | ‘ |
( | ) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | @ | A | B | C | D | E | F | G | H | I |
P | Q | R | S | T | U | V | W | X | Y | ` |
a | b | c | d | e | f | g | h | i | p | q |
r | s | t | u | v | w | x | y | | | |
| | | | | | | | | | |
| | | | | | Ā | ā | Ă | ă | Ą |
ą | Ć | ć | Ĉ | ĉ | Đ | đ | Ē | ē | Ĕ | ĕ |
Ė | ė | Ę | ę | Ġ | ġ | Ģ | ģ | Ĥ | ĥ | Ħ |
ħ | Ĩ | ĩ | İ | ı | IJ | ij | Ĵ | ĵ | Ķ | ķ |
ĸ | Ĺ | ŀ | Ł | ł | Ń | ń | Ņ | ņ | Ň | ň |
ʼn | Ő | ő | Œ | œ | Ŕ | ŕ | Ŗ | ŗ | Ř | ř |
Š | š | Ţ | ţ | Ť | ť | Ŧ | ŧ | Ũ | ũ | Ű |
ű | Ų | ų | Ŵ | ŵ | Ŷ | ŷ | Ÿ | Ź | ƀ | Ɓ |
Ƃ | ƃ | Ƅ | ƅ | Ɔ | Ƈ | ƈ | Ɖ | Ɛ | Ƒ | ƒ |
Ɠ | Ɣ | ƕ | Ɩ | Ɨ | Ƙ | ƙ | Ȁ | ȁ | Ȃ | ȃ |
Ȅ | ȅ | Ȇ | ȇ | Ȉ | ȉ | Ȑ | ȑ | Ȓ | ȓ | Ȕ |
ȕ | Ȗ | ȗ | Ș | ș | Ƞ | ȡ | Ȣ | ȣ | Ȥ | ȥ |
Ȧ | ȧ | Ȩ | ȩ | Ȱ | ȱ | Ȳ | ȳ | ȴ | ȵ | ȶ |
ȷ | ȸ | ȹ | ɀ | Ɂ | ɂ | Ƀ | Ʉ | Ʌ | Ɇ | ɇ |
Ɉ | ɉ | ɐ | ɑ | ɒ | ɓ | ɔ | ɕ | ɖ | ɗ | ɘ |
ə | ɠ | ɡ | ɢ | ɣ | ɤ | ɥ | ɦ | ɧ | ɨ | ɩ |
ɰ | ɱ | ɲ | ɳ | ɴ | ɵ | ɶ | ɷ | ɸ | ɹ | ʀ |
ʁ | ʂ | ʃ | ʄ | ʅ | ʆ | ʇ | ʈ | ʉ | ʐ | ʑ |
ʒ | ʓ | ʔ | ʕ | ʖ | ʗ | ʘ | ʙ | ̀ | ́ | ̂ |
̃ | ̄ | ̅ | ̆ | ̇ | ̈ | ̉ | ̐ | ̑ | ̒ | ̓ |
̔ | ̕ | ̖ | ̗ | ̘ | ̙ | ̠ | ̡ | ̢ | ̣ | ̤ |
̥ | ̦ | ̧ | ̨ | ̩ | ̰ | ̱ | ̲ | ̳ | ̴ | ̵ |
̶ | ̷ | ̸ | ̹ | ̀ | ́ | ͂ | ̓ | ̈́ | ͅ | ͆ |
͇ | ͈ | ͉ | ͐ | ͑ | ͒ | ͓ | ͔ | ͕ | ͖ | ͗ |
͘ | ͙ | ͠ | ͡ | ͢ | ͣ | ͤ | ͥ | ͦ | ͧ | ͨ |
΅ | Ά | · | Έ | Ή | ΐ | Α | Β | Γ | Δ | Ε |
Ζ | Η | Θ | Ι | Ѐ | Ё | Ђ | Ѓ | Є | Ѕ | І |
Ї | Ј | Љ | А | Б | В | Г | Д | Е | Ж | З |
И | Й | Р | С | Т | У | Ф | Х | Ц | Ч | Ш |
Щ | а | б | в | г | д | е | ж | з | и | й |
р | с | т | у | ф | х | ц | ч | ш | щ | ѐ |
ё | ђ | ѓ | є | ѕ | і | ї | ј | љ | Ѡ | ѡ |
Ѣ | ѣ | Ѥ | ѥ | Ѧ | ѧ | Ѩ | ѩ | Ѱ | ѱ | Ѳ |
ѳ | Ѵ | ѵ | Ѷ | ѷ | Ѹ | ѹ | Ґ | ґ | Ғ | ғ |
Ҕ | ҕ | Җ | җ | Ҙ | ҙ | Ԁ | ԁ | Ԃ | ԃ | Ԅ |
ԅ | Ԇ | ԇ | Ԉ | ԉ | Ԑ | ԑ | Ԓ |
Просмотр символов Юникода (UNICODE)
!"#$%&'()*+,-. _`abcdefghijklmnopqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿̀́͂̓̈́͆͊͋͌̕̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛ͣͤͥͦͧͨͩͪͫͬͭͮͯ͘͜͟͢͝͞͠͡ͰͱͲͳʹ͵Ͷͷͺͻͼͽ;Ϳ΄΅Ά·ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡԢԣԤԥԦԧԨԩԪԫԬԭԮԯԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ՚՛՜՝՞՟ՠաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտրցւփքօֆևֈ։֊֍֎֏ְֱֲֳִֵֶַָֹֺֻּֽ֑֖֛֢֣֤֥֦֧֪֚֭֮֒֓֔֕֗֘֙֜֝֞֟֠֡֨֩֫֬֯־ֿ׀ׁׂ׃ׅׄ׆ׇאבגדהוזחטיךכלםמןנסעףפץצקרשתׯװױײ׳״؆؇؈؉؊؋،؍؎؏ؘؙؚؐؑؒؓؔؕؖؗ؛؝؞؟ؠءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿـفقكلمنهوىيًٌٍَُِّْٕٖٜٟٓٔٗ٘ٙٚٛٝٞ٠١٢٣٤٥٦٧٨٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿڀځڂڃڄڅچڇڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙښڛڜڝڞڟڠڡڢڣڤڥڦڧڨکڪګڬڭڮگڰڱڲڳڴڵڶڷڸڹںڻڼڽھڿۀہۂۃۄۅۆۇۈۉۊۋیۍێۏېۑےۓ۔ەۖۗۘۙۚۛۜ۞ۣ۟۠ۡۢۤۥۦۧۨ۩۪ۭ۫۬ۮۯ۰۱۲۳۴۵۶۷۸۹ۺۻۼ۽۾ۿ܀܁܂܃܄܅܆܇܈܉܊܋܌܍ܐܑܒܓܔܕܖܗܘܙܚܛܜܝܞܟܠܡܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾ݂݄݆݈ܰܲܳܵܶܺܽܿ݀݁݃݅݇݉݊ݍݎݏݐݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޜޝޞޟޠޡޢޣޤޥަާިީުޫެޭޮޯްޱ߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߎߏߐߑߒߓߔߕߖߗߘߙߚߛߜߝߞߟߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߽߾߿ࠀࠁࠂࠃࠄࠅࠆࠇࠈࠉࠊࠋࠌࠍࠎࠏࠐࠑࠒࠓࠔࠕࠖࠗ࠘࠙ࠚࠛࠜࠝࠞࠟࠠࠡࠢࠣࠤࠥࠦࠧࠨࠩࠪࠫࠬ࠭࠰࠱࠲࠳࠴࠵࠶࠷࠸࠹࠺࠻࠼࠽࠾ࡀࡁࡂࡃࡄࡅࡆࡇࡈࡉࡊࡋࡌࡍࡎࡏࡐࡑࡒࡓࡔࡕࡖࡗࡘ࡙࡚࡛࡞ࡠࡡࡢࡣࡤࡥࡦࡧࡨࡩࡪࡰࡱࡲࡳࡴࡵࡶࡷࡸࡹࡺࡻࡼࡽࡾࡿࢀࢁࢂࢃࢄࢅࢆࢇ࢈ࢉࢊࢋࢌࢍࢎ࢙࢚࢛࢘࢜࢝࢞࢟ࢠࢡࢢࢣࢤࢥࢦࢧࢨࢩࢪࢫࢬࢭࢮࢯࢰࢱࢲࢳࢴࢵࢶࢷࢸࢹࢺࢻࢼࢽࢾࢿࣀࣁࣂࣃࣄࣅࣆࣇࣈࣉࣰࣱࣲ࣏࣐࣑࣒࣓ࣣࣦࣩ࣭࣮࣯ࣶࣹࣺ࣊࣋࣌࣍࣎ࣔࣕࣖࣗࣘࣙࣚࣛࣜࣝࣞࣟ࣠࣡ࣤࣥࣧࣨ࣪࣫࣬ࣳࣴࣵࣷࣸࣻࣼࣽࣾࣿऀँंःऄअआइईउऊऋऌऍऎएऐऑऒओऔकखगघङचछजझञटठडढणतथदधनऩपफबभमयरऱलळऴवशषसहऺऻ़ऽािीुूृॄॅॆेैॉॊोौ्ॎॏॐ॒॑॓॔ॕॖॗक़ख़ग़ज़ड़ढ़फ़य़ॠॡॢॣ।॥०१२३४५६७८९॰ॱॲॳॴॵॶॷॸॹॺॻॼॽॾॿঀঁংঃঅআইঈউঊঋঌএঐওঔকখগঘঙচছজঝঞটঠডঢণতথদধনপফবভমযরলশষসহ়ঽািীুূৃৄেৈোৌ্ৎৗড়ঢ়য়ৠৡৢৣ০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻ৼ৽৾ਁਂਃਅਆਇਈਉਊਏਐਓਔਕਖਗਘਙਚਛਜਝਞਟਠਡਢਣਤਥਦਧਨਪਫਬਭਮਯਰਲਲ਼ਵਸ਼ਸਹ਼ਾਿੀੁੂੇੈੋੌ੍ੑਖ਼ਗ਼ਜ਼ੜਫ਼੦੧੨੩੪੫੬੭੮੯ੰੱੲੳੴੵ੶ઁંઃઅઆઇઈઉઊઋઌઍએઐઑઓઔકખગઘઙચછજઝઞટઠડઢણતથદધનપફબભમયરલળવશષસહ઼ઽાિીુૂૃૄૅેૈૉોૌ્ૐૠૡૢૣ૦૧૨૩૪૫૬૭૮૯૰૱ૹૺૻૼ૽૾૿ଁଂଃଅଆଇଈଉଊଋଌଏଐଓଔକଖଗଘଙଚଛଜଝଞଟଠଡଢଣତଥଦଧନପଫବଭମଯରଲଳଵଶଷସହ଼ଽାିୀୁୂୃୄେୈୋୌ୍୕ୖୗଡ଼ଢ଼ୟୠୡୢୣ୦୧୨୩୪୫୬୭୮୯୰ୱ୲୳୴୵୶୷ஂஃஅஆஇஈஉஊஎஏஐஒஓஔகஙசஜஞடணதநனபமயரறலளழவஶஷஸஹாிீுூெேைொோௌ்ௐௗ௦௧௨௩௪௫௬௭௮௯௰௱௲௳௴௵௶௷௸௹௺ఀఁంఃఄఅఆఇఈఉఊఋఌఎఏఐఒఓఔకఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళఴవశషసహ఼ఽాిీుూృౄెేైొోౌ్ౕౖౘౙౚౝౠౡౢౣ౦౧౨౩౪౫౬౭౮౯౷౸౹౺౻౼౽౾౿ಀಁಂಃ಄ಅಆಇಈಉಊಋಌಎಏಐಒಓಔಕಖಗಘಙಚಛಜಝಞಟಠಡಢಣತಥದಧನಪಫಬಭಮಯರಱಲಳವಶಷಸಹ಼ಽಾಿೀುೂೃೄೆೇೈೊೋೌ್ೕೖೝೞೠೡೢೣ೦೧೨೩೪೫೬೭೮೯ೱೲೳഀഁംഃഄഅആഇഈഉഊഋഌഎഏഐഒഓഔകഖഗഘങചഛജഝഞടഠഡഢണതഥദധനഩപഫബഭമയരറലളഴവശഷസഹഺ഻഼ഽാിീുൂൃൄെേൈൊോൌ്ൎ൏ൔൕൖൗ൘൙൚൛൜൝൞ൟൠൡൢൣ൦൧൨൩൪൫൬൭൮൯൰൱൲൳൴൵൶൷൸൹ൺൻർൽൾൿඁංඃඅආඇඈඉඊඋඌඍඎඏඐඑඒඓඔඕඖකඛගඝඞඟචඡජඣඤඥඦටඨඩඪණඬතථදධනඳපඵබභමඹයරලවශෂසහළෆ්ාැෑිීුූෘෙේෛොෝෞෟ෦෧෨෩෪෫෬෭෮෯ෲෳ෴กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛ກຂຄຆງຈຉຊຌຍຎຏຐຑຒຓດຕຖທຘນບປຜຝພຟຠມຢຣລວຨຩສຫຬອຮຯະັາຳິີຶື຺ຸູົຼຽເແໂໃໄໆ່້໊໋໌ໍ໎໐໑໒໓໔໕໖໗໘໙ໜໝໞໟༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿ཀཁགགྷངཅཆཇཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚ကခဂဃငစဆဇဈဉညဋဌဍဎဏတထဒဓနပဖဗဘမယရလဝသဟဠအဢဣဤဥဦဧဨဩဪါာိီုူေဲဳဴဵံ့း္်ျြွှဿ၀၁၂၃၄၅၆၇၈၉၊။၌၍၎၏ၐၑၒၓၔၕၖၗၘၙၚၛၜၝၞၟၠၡၢၣၤၥၦၧၨၩၪၫၬၭၮၯၰၱၲၳၴၵၶၷၸၹၺၻၼၽၾၿႀႁႂႃႄႅႆႇႈႉႊႋႌႍႎႏ႐႑႒႓႔႕႖႗႘႙ႚႛႜႝ႞႟ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅჇჍაბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ჻ჼჽჾჿᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒᄓᄔᄕᄖᄗᄘᄙᄚᄛᄜᄝᄞᄟᄠᄡᄢᄣᄤᄥᄦᄧᄨᄩᄪᄫᄬᄭᄮᄯᄰᄱᄲᄳᄴᄵᄶᄷᄸᄹᄺᄻᄼᄽᄾᄿᅀᅁᅂᅃᅄᅅᅆᅇᅈᅉᅊᅋᅌᅍᅎᅏᅐᅑᅒᅓᅔᅕᅖᅗᅘᅙᅚᅛᅜᅝᅞᅟᅠᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟᆠᆡᆢᆣᆤᆥᆦᆧᆨᆩᆪᆫᆬᆭᆮᆯᆰᆱᆲᆳᆴᆵᆶᆷᆸᆹᆺᆻᆼᆽᆾᆿᇀᇁᇂᇃᇄᇅᇆᇇᇈᇉᇊᇋᇌᇍᇎᇏᇐᇑᇒᇓᇔᇕᇖᇗᇘᇙᇚᇛᇜᇝᇞᇟᇠᇡᇢᇣᇤᇥᇦᇧᇨᇩᇪᇫᇬᇭᇮᇯᇰᇱᇲᇳᇴᇵᇶᇷᇸᇹᇺᇻᇼᇽᇾᇿሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀቁቂቃቄቅቆቇቈቊቋቌቍቐቑቒቓቔቕቖቘቚቛቜቝበቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኇኈኊኋኌኍነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኯኰኲኳኴኵኸኹኺኻኼኽኾዀዂዃዄዅወዉዊዋዌውዎዏዐዑዒዓዔዕዖዘዙዚዛዜዝዞዟዠዡዢዣዤዥዦዧየዩዪያዬይዮዯደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿጀጁጂጃጄጅጆጇገጉጊጋጌግጎጏጐጒጓጔጕጘጙጚጛጜጝጞጟጠጡጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿፀፁፂፃፄፅፆፇፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፝፞፟፠፡።፣፤፥፦፧፨፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼ᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙ᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴᏵᏸᏹᏺᏻᏼᏽ᐀ᐁᐂᐃᐄᐅᐆᐇᐈᐉᐊᐋᐌᐍᐎᐏᐐᐑᐒᐓᐔᐕᐖᐗᐘᐙᐚᐛᐜᐝᐞᐟᐠᐡᐢᐣᐤᐥᐦᐧᐨᐩᐪᐫᐬᐭᐮᐯᐰᐱᐲᐳᐴᐵᐶᐷᐸᐹᐺᐻᐼᐽᐾᐿᑀᑁᑂᑃᑄᑅᑆᑇᑈᑉᑊᑋᑌᑍᑎᑏᑐᑑᑒᑓᑔᑕᑖᑗᑘᑙᑚᑛᑜᑝᑞᑟᑠᑡᑢᑣᑤᑥᑦᑧᑨᑩᑪᑫᑬᑭᑮᑯᑰᑱᑲᑳᑴᑵᑶᑷᑸᑹᑺᑻᑼᑽᑾᑿᒀᒁᒂᒃᒄᒅᒆᒇᒈᒉᒊᒋᒌᒍᒎᒏᒐᒑᒒᒓᒔᒕᒖᒗᒘᒙᒚᒛᒜᒝᒞᒟᒠᒡᒢᒣᒤᒥᒦᒧᒨᒩᒪᒫᒬᒭᒮᒯᒰᒱᒲᒳᒴᒵᒶᒷᒸᒹᒺᒻᒼᒽᒾᒿᓀᓁᓂᓃᓄᓅᓆᓇᓈᓉᓊᓋᓌᓍᓎᓏᓐᓑᓒᓓᓔᓕᓖᓗᓘᓙᓚᓛᓜᓝᓞᓟᓠᓡᓢᓣᓤᓥᓦᓧᓨᓩᓪᓫᓬᓭᓮᓯᓰᓱᓲᓳᓴᓵᓶᓷᓸᓹᓺᓻᓼᓽᓾᓿᔀᔁᔂᔃᔄᔅᔆᔇᔈᔉᔊᔋᔌᔍᔎᔏᔐᔑᔒᔓᔔᔕᔖᔗᔘᔙᔚᔛᔜᔝᔞᔟᔠᔡᔢᔣᔤᔥᔦᔧᔨᔩᔪᔫᔬᔭᔮᔯᔰᔱᔲᔳᔴᔵᔶᔷᔸᔹᔺᔻᔼᔽᔾᔿᕀᕁᕂᕃᕄᕅᕆᕇᕈᕉᕊᕋᕌᕍᕎᕏᕐᕑᕒᕓᕔᕕᕖᕗᕘᕙᕚᕛᕜᕝᕞᕟᕠᕡᕢᕣᕤᕥᕦᕧᕨᕩᕪᕫᕬᕭᕮᕯᕰᕱᕲᕳᕴᕵᕶᕷᕸᕹᕺᕻᕼᕽᕾᕿᖀᖁᖂᖃᖄᖅᖆᖇᖈᖉᖊᖋᖌᖍᖎᖏᖐᖑᖒᖓᖔᖕᖖᖗᖘᖙᖚᖛᖜᖝᖞᖟᖠᖡᖢᖣᖤᖥᖦᖧᖨᖩᖪᖫᖬᖭᖮᖯᖰᖱᖲᖳᖴᖵᖶᖷᖸᖹᖺᖻᖼᖽᖾᖿᗀᗁᗂᗃᗄᗅᗆᗇᗈᗉᗊᗋᗌᗍᗎᗏᗐᗑᗒᗓᗔᗕᗖᗗᗘᗙᗚᗛᗜᗝᗞᗟᗠᗡᗢᗣᗤᗥᗦᗧᗨᗩᗪᗫᗬᗭᗮᗯᗰᗱᗲᗳᗴᗵᗶᗷᗸᗹᗺᗻᗼᗽᗾᗿᘀᘁᘂᘃᘄᘅᘆᘇᘈᘉᘊᘋᘌᘍᘎᘏᘐᘑᘒᘓᘔᘕᘖᘗᘘᘙᘚᘛᘜᘝᘞᘟᘠᘡᘢᘣᘤᘥᘦᘧᘨᘩᘪᘫᘬᘭᘮᘯᘰᘱᘲᘳᘴᘵᘶᘷᘸᘹᘺᘻᘼᘽᘾᘿᙀᙁᙂᙃᙄᙅᙆᙇᙈᙉᙊᙋᙌᙍᙎᙏᙐᙑᙒᙓᙔᙕᙖᙗᙘᙙᙚᙛᙜᙝᙞᙟᙠᙡᙢᙣᙤᙥᙦᙧᙨᙩᙪᙫᙬ᙭᙮ᙯᙰᙱᙲᙳᙴᙵᙶᙷᙸᙹᙺᙻᙼᙽᙾᙿ ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ᚛᚜ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᛱᛲᛳᛴᛵᛶᛷᛸᜀᜁᜂᜃᜄᜅᜆᜇᜈᜉᜊᜋᜌᜍᜎᜏᜐᜑᜒᜓ᜔᜕ᜟᜠᜡᜢᜣᜤᜥᜦᜧᜨᜩᜪᜫᜬᜭᜮᜯᜰᜱᜲᜳ᜴᜵᜶ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓᝠᝡᝢᝣᝤᝥᝦᝧᝨᝩᝪᝫᝬᝮᝯᝰᝲᝳកខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞសហឡអឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ឴឵ាិីឹឺុូួើឿៀេែៃោៅំះៈ៉៊់៌៍៎៏័៑្៓។៕៖ៗ៘៙៚៛ៜ៝០១២៣៤៥៦៧៨៩៰៱៲៳៴៵៶៷៸៹᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊᠋᠌᠍᠏᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙ᠠᠡᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿᡀᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳᡴᡵᡶᡷᡸᢀᢁᢂᢃᢄᢅᢆᢇᢈᢉᢊᢋᢌᢍᢎᢏᢐᢑᢒᢓᢔᢕᢖᢗᢘᢙᢚᢛᢜᢝᢞᢟᢠᢡᢢᢣᢤᢥᢦᢧᢨᢩᢪᢰᢱᢲᢳᢴᢵᢶᢷᢸᢹᢺᢻᢼᢽᢾᢿᣀᣁᣂᣃᣄᣅᣆᣇᣈᣉᣊᣋᣌᣍᣎᣏᣐᣑᣒᣓᣔᣕᣖᣗᣘᣙᣚᣛᣜᣝᣞᣟᣠᣡᣢᣣᣤᣥᣦᣧᣨᣩᣪᣫᣬᣭᣮᣯᣰᣱᣲᣳᣴᣵᤀᤁᤂᤃᤄᤅᤆᤇᤈᤉᤊᤋᤌᤍᤎᤏᤐᤑᤒᤓᤔᤕᤖᤗᤘᤙᤚᤛᤜᤝᤞᤠᤡᤢᤣᤤᤥᤦᤧᤨᤩᤪᤫᤰᤱᤲᤳᤴᤵᤶᤷᤸ᤻᤹᤺᥀᥄᥅᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ᥐᥑᥒᥓᥔᥕᥖᥗᥘᥙᥚᥛᥜᥝᥞᥟᥠᥡᥢᥣᥤᥥᥦᥧᥨᥩᥪᥫᥬᥭᥰᥱᥲᥳᥴᦀᦁᦂᦃᦄᦅᦆᦇᦈᦉᦊᦋᦌᦍᦎᦏᦐᦑᦒᦓᦔᦕᦖᦗᦘᦙᦚᦛᦜᦝᦞᦟᦠᦡᦢᦣᦤᦥᦦᦧᦨᦩᦪᦫᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿᧀᧁᧂᧃᧄᧅᧆᧇᧈᧉ᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᧚᧞᧟᧠᧡᧢᧣᧤᧥᧦᧧᧨᧩᧪᧫᧬᧭᧮᧯᧰᧱᧲᧳᧴᧵᧶᧷᧸᧹᧺᧻᧼᧽᧾᧿ᨀᨁᨂᨃᨄᨅᨆᨇᨈᨉᨊᨋᨌᨍᨎᨏᨐᨑᨒᨓᨔᨕᨖᨘᨗᨙᨚᨛ᨞᨟ᨠᨡᨢᨣᨤᨥᨦᨧᨨᨩᨪᨫᨬᨭᨮᨯᨰᨱᨲᨳᨴᨵᨶᨷᨸᨹᨺᨻᨼᨽᨾᨿᩀᩁᩂᩃᩄᩅᩆᩇᩈᩉᩊᩋᩌᩍᩎᩏᩐᩑᩒᩓᩔᩕᩖᩗᩘᩙᩚᩛᩜᩝᩞ᩠ᩡᩢᩣᩤᩥᩦᩧᩨᩩᩪᩫᩬᩭᩮᩯᩰᩱᩲᩳᩴ᩿᩵᩶᩷᩸᩹᩺᩻᩼᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙᪠᪡᪢᪣᪤᪥᪦ᪧ᪨᪩᪪᪫᪬᪭᪵᪶᪷᪸᪹᪺᪽᪰᪱᪲᪳᪴᪻᪼᪾ᪿᫀ᫃᫄᫊᫁᫂᫅᫆᫇᫈᫉᫋ᫌᫍᫎᬀᬁᬂᬃᬄᬅᬆᬇᬈᬉᬊᬋᬌᬍᬎᬏᬐᬑᬒᬓᬔᬕᬖᬗᬘᬙᬚᬛᬜᬝᬞᬟᬠᬡᬢᬣᬤᬥᬦᬧᬨᬩᬪᬫᬬᬭᬮᬯᬰᬱᬲᬳ᬴ᬵᬶᬷᬸᬹᬺᬻᬼᬽᬾᬿᭀᭁᭂᭃ᭄ᭅᭆᭇᭈᭉᭊᭋᭌ᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᭚᭛᭜᭝᭞᭟᭠᭡᭢᭣᭤᭥᭦᭧᭨᭩᭪᭬᭫᭭᭮᭯᭰᭱᭲᭳᭴᭵᭶᭷᭸᭹᭺᭻᭼᭽᭾ᮀᮁᮂᮃᮄᮅᮆᮇᮈᮉᮊᮋᮌᮍᮎᮏᮐᮑᮒᮓᮔᮕᮖᮗᮘᮙᮚᮛᮜᮝᮞᮟᮠᮡᮢᮣᮤᮥᮦᮧᮨᮩ᮪᮫ᮬᮭᮮᮯ᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹ᮺᮻᮼᮽᮾᮿᯀᯁᯂᯃᯄᯅᯆᯇᯈᯉᯊᯋᯌᯍᯎᯏᯐᯑᯒᯓᯔᯕᯖᯗᯘᯙᯚᯛᯜᯝᯞᯟᯠᯡᯢᯣᯤᯥ᯦ᯧᯨᯩᯪᯫᯬᯭᯮᯯᯰᯱ᯲᯳᯼᯽᯾᯿ᰀᰁᰂᰃᰄᰅᰆᰇᰈᰉᰊᰋᰌᰍᰎᰏᰐᰑᰒᰓᰔᰕᰖᰗᰘᰙᰚᰛᰜᰝᰞᰟᰠᰡᰢᰣᰤᰥᰦᰧᰨᰩᰪᰫᰬᰭᰮᰯᰰᰱᰲᰳᰴᰵᰶ᰷᰻᰼᰽᰾᰿᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉ᱍᱎᱏ᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙ᱚᱛᱜᱝᱞᱟᱠᱡᱢᱣᱤᱥᱦᱧᱨᱩᱪᱫᱬᱭᱮᱯᱰᱱᱲᱳᱴᱵᱶᱷᱸᱹᱺᱻᱼᱽ᱾᱿ᲀᲁᲂᲃᲄᲅᲆᲇᲈᲐᲑᲒᲓᲔᲕᲖᲗᲘᲙᲚᲛᲜᲝᲞᲟᲠᲡᲢᲣᲤᲥᲦᲧᲨᲩᲪᲫᲬᲭᲮᲯᲰᲱᲲᲳᲴᲵᲶᲷᲸᲹᲺᲽᲾᲿ᳀᳁᳂᳃᳄᳅᳆᳇᳐᳑᳒᳓᳔᳕᳖᳗᳘᳙᳜᳝᳞᳟᳚᳛᳠᳡᳢᳣᳤᳥᳦᳧᳨ᳩᳪᳫᳬ᳭ᳮᳯᳰᳱᳲᳳ᳴ᳵᳶ᳷᳸᳹ᳺᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ᷐᷎᷺᷂᷊᷏᷹᷽᷿᷷᷸᷀᷁᷃᷄᷅᷆᷇᷈᷉᷋᷌᷑᷒ᷓᷔᷕᷖᷗᷘᷙᷚᷛᷜᷝᷞᷟᷠᷡᷢᷣᷤᷥᷦᷧᷨᷩᷪᷫᷬᷭᷮᷯᷰᷱᷲᷳᷴ᷵᷻᷾᷶᷼᷍ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗὙὛὝὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐῖῗῘῙῚΊ῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`ῲῳῴῶῷῸΌῺΏῼ´῾ ‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ ⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₔₕₖₗₘₙₚₛₜ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿⃀⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟⃠⃡⃢⃣⃤⃥⃦⃪⃫⃨⃬⃭⃮⃯⃧⃩⃰℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟℠℡™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺℻ℼℽℾℿ⅀⅁⅂⅃⅄ⅅⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉↊↋←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟⏠⏡⏢⏣⏤⏥⏦⏧⏨⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺⏻⏼⏽⏾⏿␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟␠␡␢␣␥␦⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟⤠⤡⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿⥀⥁⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚⨛⨜⨝⨞⨟⨠⨡⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾⨿⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩙⩚⩛⩜⩝⩞⩟⩠⩡⩢⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚⫛⫝̸⫝⫞⫟⫠⫡⫢⫣⫤⫥⫦⫧⫨⫩⫪⫫⫬⫭⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟⭠⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮗⮘⮙⮚⮛⮜⮝⮞⮟⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟⰠⰡⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰯⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞⱟⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪ⳫⳬⳭⳮ⳯⳰⳱Ⳳⳳ⳹⳺⳻⳼⳽⳾⳿ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥⴧⴭⴰⴱⴲⴳⴴⴵⴶⴷⴸⴹⴺⴻⴼⴽⴾⴿⵀⵁⵂⵃⵄⵅⵆⵇⵈⵉⵊⵋⵌⵍⵎⵏⵐⵑⵒⵓⵔⵕⵖⵗⵘⵙⵚⵛⵜⵝⵞⵟⵠⵡⵢⵣⵤⵥⵦⵧⵯ⵰⵿ⶀⶁⶂⶃⶄⶅⶆⶇⶈⶉⶊⶋⶌⶍⶎⶏⶐⶑⶒⶓⶔⶕⶖⶠⶡⶢⶣⶤⶥⶦⶨⶩⶪⶫⶬⶭⶮⶰⶱⶲⶳⶴⶵⶶⶸⶹⶺⶻⶼⶽⶾⷀⷁⷂⷃⷄⷅⷆⷈⷉⷊⷋⷌⷍⷎⷐⷑⷒⷓⷔⷕⷖⷘⷙⷚⷛⷜⷝⷞⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟⸠⸡⸢⸣⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮ⸯ⸰⸱⸲⸳⸴⸵⸶⸷⸸⸹⸺⸻⸼⸽⸾⸿⹀⹁⹂⹃⹄⹅⹆⹇⹈⹉⹊⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜⹝⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺛⺜⺝⺞⺟⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻ 、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゙゚゛゜ゝゞゟ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ㆐㆑㆒㆓㆔㆕㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟ㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆵㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ㇀㇁㇂㇃㇄㇅㇆㇇㇈㇉㇊㇋㇌㇍㇎㇏㇐㇑㇒㇓㇔㇕㇖㇗㇘㇙㇚㇛㇜㇝㇞㇟㇠㇡㇢㇣ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㈝㈞㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉼㉽㉾㉿㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㋌㋍㋎㋏㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㋿㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿㐀㐁㐂㐃㐄㐅㐆㐇㐈㐉㐊㐋㐌㐍㐎㐏㐐㐑㐒㐓ﷰﷱﷲﷳﷴﷵﷶﷷﷸﷹﷺﷻ﷼﷽﷾﷿︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️︐︑︒︓︔︕︖︗︘︙︧︨︩︪︫︬︭︠︡︢︣︤︥︦︮︯︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹨﹩﹪﹫ﹰﹱﹲﹳﹴﹶﹷﹸﹹﹺﹻﹼﹽﹾﹿﺀﺁﺂﺃﺄﺅﺆﺇﺈﺉﺊﺋﺌﺍﺎﺏﺐﺑﺒﺓﺔﺕﺖﺗﺘﺙﺚﺛﺜﺝﺞﺟﺠﺡﺢﺣﺤﺥﺦﺧﺨﺩﺪﺫﺬﺭﺮﺯﺰﺱﺲﺳﺴﺵﺶﺷﺸﺹﺺﺻﺼﺽﺾﺿﻀﻁﻂﻃﻄﻅﻆﻇﻈﻉﻊﻋﻌﻍﻎﻏﻐﻑﻒﻓﻔﻕﻖﻗﻘﻙﻚﻛﻜﻝﻞﻟﻠﻡﻢﻣﻤﻥﻦﻧﻨﻩﻪﻫﻬﻭﻮﻯﻰﻱﻲﻳﻴﻵﻶﻷﻸﻹﻺﻻﻼ!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚ᅠᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ¢£¬ ̄¦¥₩│←↑→↓■○�
кодек ascii не может декодировать байт 0xef в позиции 1
Вопрос:
У меня есть несколько проблем, пытающихся закодировать строку в UTF-8. Я пробовал много вещей, включая использование string.encode('utf-8')
и unicode(string)
, но я получаю ошибку:
UnicodeDecodeError: кодек ascii не может декодировать байт 0xef в позиции 1: порядковый номер не в диапазоне (128)
Это моя строка:
(。・ω・。)ノ
Я не понимаю, что происходит не так, любая идея?
Изменить: проблема в том, что печать строки, поскольку она не отображается должным образом. Кроме того, эта ошибка, когда я пытаюсь ее преобразовать:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
Лучший ответ:
Это связано с тем, что кодировка вашего терминала не установлена на UTF-8. Вот мой терминал
$ echo $LANG
en_GB.UTF-8
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>>
На моем терминале пример работает с указанным выше, но если я избавлюсь от параметра LANG
, то он не будет работать
$ unset LANG
$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
>>>
Обратитесь к документам для вашего варианта linux, чтобы узнать, как сделать это изменение постоянным.
Ответ №1
попробовать:
string.decode('utf-8') # or:
unicode(string, 'utf-8')
изменить:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
дает u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, что верно.
поэтому ваша проблема должна быть в каком-то другом месте, возможно, если вы попытаетесь что-то сделать с ней, произойдет неявное преобразование (может быть печать, запись в поток…)
чтобы сказать больше, нам нужно будет увидеть код.
Ответ №2
Мой комментарий +1 к mata на qaru.site/questions/65482/… и демонстрации Ник Крейг-Вуд. Вы правильно декодировали строку. Проблема заключается в команде print
, поскольку она преобразует строку Unicode в консольную кодировку, а консоль не может отображать строку. Попробуйте записать строку в файл и посмотреть результат с помощью какого-нибудь достойного редактора, который поддерживает Unicode:
import codecs
s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
s1 = s. decode('utf-8')
f = codecs.open('out.txt', 'w', encoding='utf-8')
f.write(s1)
f.close()
Затем вы увидите (。・ω・。)ノ
.
Ответ №3
Если вы работаете на удаленном хосте, посмотрите /etc/ssh/ssh_config
на локальном ПК.
Если этот файл содержит строку:
SendEnv LANG LC_*
прокомментируйте это, добавив #
в начало строки. Это может помочь.
В этой строке ssh
отправляет языковые переменные среды, связанные с вашим компьютером, на удаленный хост. Это вызывает проблемы .
Ответ №4
Нет проблем с моим терминалом. Вышеупомянутые ответы помогли мне взглянуть в правильном направлении, но это не сработало для меня, пока я не добавил 'ignore'
:
fix_encoding = lambda s: s.decode('utf8', 'ignore')
Как указано в комментарии ниже, это может привести к нежелательным результатам. OTOH также может просто сделать трюк достаточно хорошо, чтобы заставить все работать, и вы не заботитесь о потере некоторых персонажей.
Ответ №5
Похоже, ваша строка закодирована до utf-8
, так что же такое проблема? Или что вы пытаетесь сделать здесь??
Python 2.7.3 (default, Apr 20 2012, 22:39:59)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
(。・ω・。)ノ
>>> s2 = u'(。・ω・。)ノ'
>>> s2 == s1
True
>>> s2
u'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
Ответ №6
это работает для ubuntu 15.10:
sudo locale-gen "en_US.UTF-8"
sudo dpkg-reconfigure locales
Ответ №7
В моем случае это было вызвано сохранением моего файла Unicode с помощью «спецификации». Чтобы решить эту проблему, я взломал файл с помощью BBEdit и сделал «Сохранить как…», выбрав для кодирования «Unicode (UTF-8)», а не то, что он пришел, с которым был «Unicode (UTF-8, с спецификацией)»
Ответ №8
Я получал такую же ошибку, и обнаружил, что консоль не может отображать строку на другом языке. Поэтому я сделал следующие изменения кода, чтобы установить default_charset как UTF-8.
data_head = [('\x81\xa1\x8fo\x89\xef\x82\xa2\x95\xdb\x8f\xd8\x90\xa7\x93x\x81\xcb3\x8c\x8e\x8cp\x91\xb1\x92\x86(\x81\x86\x81\xde\x81\x85)\x81\xa1\x8f\x89\x89\xf1\x88\xc8\x8aO\x81A\x82\xa8\x8b\xe0\x82\xcc\x90S\x94z\x82\xcd\x88\xea\x90\xd8\x95s\x97v\x81\xa1\x83}\x83b\x83v\x82\xcc\x82\xa8\x8e\x8e\x82\xb5\x95\xdb\x8c\xaf\x82\xc5\x8fo\x89\xef\x82\xa2\x8am\x92\xe8\x81\xa1', 'shift_jis')]
default_charset = 'UTF-8' #can also try 'ascii' or other unicode type
print ''.join([ unicode(lin[0], lin[1] or default_charset) for lin in data_head ])
Ответ №9
Попробуйте установить системную по умолчанию кодировку как utf-8
в начале script, чтобы все строки были закодированы с использованием этого.
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
Ответ №10
Это лучший ответ:
qaru.site/questions/11795/…
в linux:
export PYTHONIOENCODING=utf-8
поэтому sys. stdout.encoding
в порядке.
Ответ №11
Я решаю эту проблему, изменяющуюся в файле settings.py с помощью «ENGINE»: «django.db.backends.mysql», не используйте «ENGINE»: «mysql.connector.django»,
Ответ №12
Просто преобразуйте текст в строку с помощью str()
. Работал для меня.
Юникод и байты | Кодкамп — онлайн-институт цифровых навыков
Введение
Примеры
основы
В Python 3 str
это тип с поддержкой Юникода строк, в то время как bytes
типа для последовательностей необработанных байт.
type("f") == type(u"f") # True, <class 'str'>
type(b"f") # <class 'bytes'>
В Python 2 случайная строка была последовательность необработанных байтов по умолчанию , а строка Юникода была каждая строка с «U» префиксом.
type("f") == type(b"f") # True, <type 'str'>
type(u"f") # <type 'unicode'>
Строки Unicode могут быть преобразованы в байты с . encode(encoding)
.
Python 3
>>> "£13.55".encode('utf8')
b'\xc2\xa313.55'
>>> "£13.55".encode('utf16')
b'\xff\xfe\xa3\x001\x003\x00.\x005\x005\x00'
Python 2
в PY2 кодирования консоли по умолчанию sys.getdefaultencoding() == 'ascii'
, а не utf-8
, как и в PY3, поэтому его печати , как и в предыдущем примере, непосредственно не возможно.
>>> print type(u"£13.55".encode('utf8'))
<type 'str'>
>>> print u"£13.55".encode('utf8')
SyntaxError: Non-ASCII character '\xc2' in...
# with encoding set inside a file
# -*- coding: utf-8 -*-
>>> print u"£13.55".encode('utf8')
£13.55
Если кодирование не может справиться с строкой, UnicodeEncodeError
поднимается:
>>> "£13.55".encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\xa3' in position 0: ordinal not in range(128)
Б могут быть преобразованы в Юникоду строк с . decode(encoding)
.
Последовательность байтов может быть преобразована в строку Unicode только через соответствующую кодировку!
>>> b'\xc2\xa313.55'.decode('utf8')
'£13.55'
Если кодирование не может справиться с строкой, UnicodeDecodeError
поднимается:
>>> b'\xc2\xa313.55'.decode('utf16')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/csaftoiu/csaftoiu-github/yahoo-groups-backup/.virtualenv/bin/../lib/python3.5/encodings/utf_16.py", line 16, in decode
return codecs.utf_16_decode(input, errors, True)
UnicodeDecodeError: 'utf-16-le' codec can't decode byte 0x35 in position 6: truncated data
Обработка ошибок кодирования / декодирования
.encode
и .decode
оба имеют режимы ошибок.
По умолчанию 'strict'
, что вызывает исключения ошибки. Другие режимы более щадящие.
>>> "£13. 55".encode('ascii', errors='replace')
b'?13.55'
>>> "£13.55".encode('ascii', errors='ignore')
b'13.55'
>>> "£13.55".encode('ascii', errors='namereplace')
b'\\N{POUND SIGN}13.55'
>>> "£13.55".encode('ascii', errors='xmlcharrefreplace')
b'£13.55'
>>> "£13.55".encode('ascii', errors='backslashreplace')
b'\\xa313.55'
>>> b = "£13.55".encode('utf8')
>>> b.decode('ascii', errors='replace')
'��13.55'
>>> b.decode('ascii', errors='ignore')
'13.55'
>>> b.decode('ascii', errors='backslashreplace')
'\\xc2\\xa313.55'
Из вышесказанного ясно, что при работе с юникодом и байтами важно сохранять правильность кодировки.
Файловый ввод / вывод
Файлы открываются в недвоичном режиме (например , 'r'
или 'w'
) сделки со строками. Кодирование является умолчанию используется именно 'utf8'
.
open(fn, mode='r') # opens file for reading in utf8
open(fn, mode='r', encoding='utf16') # opens file for reading utf16
# ERROR: cannot write bytes when a string is expected:
open("foo. txt", "w").write(b"foo")
Файлы открываются в двоичном режиме (например , 'rb'
или 'wb'
) сделки с байтами. Аргумент кодирования не может быть указан, поскольку кодировка отсутствует.
open(fn, mode='wb') # open file for writing bytes
# ERROR: cannot write string when bytes is expected:
open(fn, mode='wb').write("hi")
Синтаксис
Параметры
Примечания
Макрос перекодировки (изменения кодировки) текста и файлов
Функции ChangeFileCharset и ChangeTextCharset предназначены для изменения кодировки символов в текстовых файлах и строках.
Исходную и конечную (желаемую) кодировку можно задать в параметрах вызова функций.
ВНИМАНИЕ: Новая (универсальная) версия функции сохранения текста в файл в заданной кодировке:
http://excelvba.ru/code/SaveTextToFile
Список доступных на вашем компьютере кодировок можно найти в реестре Windows в ветке
HKEY_CLASSES_ROOT\MIME\Database\Charset
Среди доступных кодировок есть koi8-r, ascii, utf-7, utf-8, Windows-1250, Windows-1251, Windows-1252, и т. д. и т.п.
Определить исходную и конечную кодировку можно, воспользовавшись онлайн-декодером:
http://www.artlebedev.ru/tools/decoder/advanced/
(после преобразования снизу будет написано, из какой кодировки в какую переведён текст)
Sub ПримерИспользования_ChangeTextCharset()
ИсходнаяСтрока = "бНОПНЯ"
' вызываем функцию ChangeTextCharset с указанием кодировок
' (меняем кодировку с KOI8-R на Windows-1251)
ПерекодированнаяСтрока = ChangeTextCharset(ИсходнаяСтрока, "Windows-1251", "KOI8-R")
MsgBox "Результат перекодировки: """ & ПерекодированнаяСтрока & """", _
vbInformation, "Исходная строка: """ & ИсходнаяСтрока & """"
End Sub
Function ChangeFileCharset(ByVal filename$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As Boolean
' функция перекодировки (смены кодировки) текстового файла
' В качестве параметров функция получает путь filename$ к текстовому файлу,
' и название кодировки DestCharset$ (в которую будет переведён файл)
' Функция возвращает TRUE, если перекодировка прошла успешно
On Error Resume Next: Err. Clear
With CreateObject("ADODB.Stream")
.Type = 2
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.LoadFromFile filename$ ' загружаем данные из файла
FileContent$ = .ReadText ' считываем текст файла в переменную FileContent$
.Close
.Charset = DestCharset$ ' назначаем новую кодировку
.Open
.WriteText FileContent$
.SaveToFile filename$, 2 ' сохраняем файл уже в новой кодировке
.Close
End With
ChangeFileCharset = Err = 0
End Function
Function ChangeTextCharset(ByVal txt$, ByVal DestCharset$, _
Optional ByVal SourceCharset$) As String
' функция перекодировки (смены кодировки) текстовоq строки
' В качестве параметров функция получает текстовую строку txt$,
' и название кодировки DestCharset$ (в которую будет переведён текст)
' Функция возвращает текст в новой кодировке
On Error Resume Next: Err. Clear
With CreateObject("ADODB.Stream")
.Type = 2: .Mode = 3
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.WriteText txt$
.Position = 0
.Charset = DestCharset$ ' назначаем новую кодировку
ChangeTextCharset = .ReadText
.Close
End With
End Function
‘ Функция для перекодировки файла в UTF-8 без BOM (то же самое, что и UTF-8, только без первых 3 байтов)
Function ChangeFileCharset_UTF8noBOM(ByVal filename$, Optional ByVal SourceCharset$) As Boolean
' функция перекодировки (смены кодировки) текстового файла
' В качестве параметров функция получает путь filename$ к текстовому файлу,
' Функция возвращает TRUE, если перекодировка прошла успешно
On Error Resume Next: Err.Clear
DestCharset$ = "utf-8"
With CreateObject("ADODB. Stream")
.Type = 2
If Len(SourceCharset$) Then .Charset = SourceCharset$ ' указываем исходную кодировку
.Open
.LoadFromFile filename$ ' загружаем данные из файла
FileContent$ = .ReadText ' считываем текст файла в переменную FileContent$
.Close
.Charset = DestCharset$ ' назначаем новую кодировку "utf-8"
.Open
.WriteText FileContent$
'Write your data into the stream.
Dim binaryStream As Object
Set binaryStream = CreateObject("ADODB.Stream")
binaryStream.Type = 1
binaryStream.Mode = 3
binaryStream.Open
'Skip BOM bytes
.Position = 3
.CopyTo binaryStream
.Flush
. Close
binaryStream.SaveToFile filename$, 2
binaryStream.Close
End With
ChangeFileCharset_UTF8noBOM = Err = 0
End Function
Функция перекодировки текста в UTF-8 без BOM
Function EncodeUTF8noBOM(ByVal txt As String) As String
For i = 1 To Len(txt)
l = Mid(txt, i, 1)
Select Case AscW(l)
Case Is > 4095: t = Chr(AscW(l) \ 64 \ 64 + 224) & Chr(AscW(l) \ 64) & Chr(8 * 16 + AscW(l) Mod 64)
Case Is > 127: t = Chr(AscW(l) \ 64 + 192) & Chr(8 * 16 + AscW(l) Mod 64)
Case Else: t = l
End Select
EncodeUTF8noBOM = EncodeUTF8noBOM & t
Next
End Function
- 87909 просмотров
Конвертер Unicode Кодирование и декодирование
CodeTools
Инструменты изображения
- Генератор логотипов в стиле Pornhub
- Генератор логотипов в стиле Youtube
- Генератор логотипов в стиле Tiktok
- Конвертер видео в GIF
Онлайн редактор
- Редактор Markdown
- Редактор форматированного текста
- Редактор Json
- Редактор изображений
Строковые утилиты
- Base64
- Кодировать URL
- HTML-объекты
- Unicode
Криптография и безопасность
- Генератор SHA-512
- Генератор SHA-384
- Генератор SHA-256
- Генератор SHA-224
- Генератор SHA-3
- Генератор SHA-1
- Генератор MD5
Конвертер
- Markdown
Кодирование URL | Инструменты для кода онлайн
CodeTools
Инструменты изображения
- Генератор логотипов в стиле Pornhub
- Генератор логотипов в стиле Youtube
- Генератор логотипов в стиле Tiktok
- Конвертер видео в GIF
Онлайн редактор
- Редактор Markdown
- Редактор форматированного текста
- Редактор Json
- Редактор изображений
Строковые утилиты
- Base64
- Кодирование URL
- HTML-объекты
- Unicode
Криптография и безопасность
- Генератор SHA-512
- Генератор SHA-384
- Генератор SHA-256
- Генератор SHA-224
- Генератор SHA-3
- Генератор SHA-1
- Генератор MD5
Конвертер
- Markdown
кодеков — Кодирование и декодирование строк
Назначение: | Кодеры и декодеры для преобразования текста между разными представлениями. |
---|---|
Доступен в версии: | 2.1 и более поздних версий |
Модуль кодеков обеспечивает потоковые и файловые интерфейсы для
перекодирование данных в вашей программе. Чаще всего используется для работы
с текстом Unicode, но другие кодировки также доступны для других
целей.
Юникод Праймер
CPython 2.x поддерживает два типа строк для работы с текстовыми данными.
Экземпляры str в старом стиле используют один 8-битный байт для представления
каждый символ строки использует свой код ASCII.По сравнению,
Строки Юникода управляются внутри как последовательность
Кодовые точки Unicode . Значения кодовой точки сохраняются как последовательность
размером 2 или 4 байта каждый, в зависимости от параметров, заданных, когда Python был
составлен. И unicode, и str являются производными от
общий базовый класс и поддерживает аналогичный API.
Когда выводятся строки Unicode, они кодируются с использованием одного
нескольких стандартных схем, так что последовательность байтов может быть
позже реконструируется как та же струна. Байты закодированного
значение не обязательно совпадает со значениями кодовой точки, и
кодирование определяет способ перевода между двумя наборами значений.Для чтения данных Unicode также необходимо знать кодировку, чтобы
входящие байты могут быть преобразованы во внутреннее представление, используемое
класс юникода.
Наиболее распространенными кодировками для западных языков являются UTF-8 и
UTF-16, в котором используются последовательности из одно- и двухбайтовых значений.
соответственно для представления каждого символа. Другие кодировки могут быть больше
эффективен для хранения языков, на которых большинство символов
представлены кодовыми точками, которые не умещаются в два байта.
См. Также
Дополнительную вводную информацию о Unicode см. В списке
ссылок в конце этого раздела.Юникод Python
HOWTO особенно полезно.
Кодировки
Лучший способ понять кодировки — это посмотреть на разные
серия байтов, полученная путем кодирования одной и той же строки в разных
способами. В приведенных ниже примерах используется эта функция для форматирования байтовой строки.
чтобы было легче читать.
импорт binascii def to_hex (t, nbytes): «Форматировать текст t как последовательность значений длиной n байтов, разделенных пробелами». chars_per_item = nbytes * 2 hex_version = binascii.Hexlify (т) num_chunks = len (шестнадцатеричная_версия) / chars_per_item def chunkify (): для начала в xrange (0, len (hex_version), chars_per_item): yield hex_version [начало: начало + chars_per_item] возврат '' .join (chunkify ()) если __name__ == '__main__': печать to_hex ('abcdef', 1) печать to_hex ('abcdef', 2)
Функция использует binascii для получения шестнадцатеричного представления.
входной байтовой строки, затем вставьте пробел между каждыми nbytes
байтов перед возвратом значения.
$ python codecs_to_hex.py 61 62 63 64 65 66 6162 6364 6566
Первый пример кодировки начинается с печати текста ‘pi: π’
используя необработанное представление класса юникода. Π
символ заменяется выражением для кодовой точки Unicode,
\ u03c0. Следующие две строки кодируют строку как UTF-8 и UTF-16.
соответственно, и показать шестнадцатеричные значения, полученные в результате
кодирование.
из codecs_to_hex импортировать в_hex текст = u'pi: π ' print 'Raw:', repr (текст) напечатайте 'UTF-8:', to_hex (text.кодировать ('utf-8'), 1) напечатать 'UTF-16:', to_hex (text.encode ('utf-16'), 2)
Результатом кодирования строки Unicode является str
объект.
$ python codecs_encodings.py Raw: u'pi: \ u03c0 ' UTF-8: 70 69 3a 20 ср 80 UTF-16: fffe 7000 6900 3a00 2000 c003
Учитывая последовательность закодированных байтов как экземпляр str,
decode () переводит их в кодовые точки и возвращает
последовательность как экземпляр Unicode.
из codecs_to_hex импортировать в_hex текст = u'pi: π ' закодированный = текст.кодировать ('utf-8') декодированный = кодированный.decode ('utf-8') print 'Original:', repr (текст) print 'Encoded:', to_hex (закодировано, 1), тип (закодировано) print 'Decoded:', repr (декодировано), type (декодировано)
Выбор используемой кодировки не меняет тип вывода.
$ python codecs_decode.py Оригинал: u'pi: \ u03c0 ' Закодировано: 70 69 3a 20 cf 80Декодировано: u'pi: \ u03c0 '
Примечание
Кодировка по умолчанию устанавливается в процессе запуска интерпретатора,
когда сайт загружен.См. Параметры Unicode по умолчанию
для описания настроек кодировки по умолчанию, доступных через
sys.
Работа с файлами
Кодирование и декодирование строк особенно важно при работе с
с операциями ввода-вывода. Если вы пишете в файл, сокет или
другой поток, вы захотите убедиться, что данные используют
правильная кодировка. Как правило, все текстовые данные необходимо декодировать из
его байтовое представление, как оно читается, и закодировано из внутреннего
значения в конкретное представление, как это написано.Ваша программа
может явно кодировать и декодировать данные, но в зависимости от кодировки
использовать его может быть нетривиальным, чтобы определить, достаточно ли вы прочитали
байтов, чтобы полностью декодировать данные. кодеки обеспечивают
классы, которые управляют кодированием и декодированием данных за вас, так что вы
не нужно создавать свои собственные.
Самый простой интерфейс, предоставляемый кодеками, заменяет
встроенная функция open (). Новая версия работает так же, как
встроенный, но добавляет два новых аргумента для указания кодировки и
желаемый метод обработки ошибок.
из codecs_to_hex импортировать в_hex импортировать кодеки import sys кодировка = sys.argv [1] имя файла = кодировка + '.txt' print 'Запись в', имя файла с codecs.open (filename, mode = 'wt', encoding = encoding) как f: f.write (u'pi: \ u03c0 ') # Определяем группировку байтов для использования в to_hex () nbytes = {'utf-8': 1, 'utf-16': 2, 'utf-32': 4, } .get (кодировка, 1) # Показать необработанные байты в файле print 'Содержимое файла:' с open (filename, mode = 'rt') как f: напечатать to_hex (f.read (), nbytes)
Начиная со строки Unicode с кодовой точкой для π,
этот пример сохраняет текст в файл, используя кодировку, указанную в
командная строка.
$ python codecs_open_write.py utf-8 Запись в utf-8.txt Содержимое файла: 70 69 3a 20 ср 80 $ python codecs_open_write.py utf-16 Запись в utf-16.txt Содержимое файла: fffe 7000 6900 3a00 2000 c003 $ python codecs_open_write.py utf-32 Запись в utf-32.txt Содержимое файла: fffe0000 70000000 600 3a000000 20000000 c0030000
Чтение данных с помощью open () несложно, с одной уловкой:
вы должны знать кодировку заранее, чтобы настроить декодер
правильно.Некоторые форматы данных, такие как XML, позволяют указать
кодирование как часть файла, но обычно это зависит от приложения
справляться. кодеки просто принимают кодировку в качестве аргумента и
предполагает, что это правильно.
импортных кодеков import sys кодировка = sys.argv [1] имя файла = кодировка + '.txt' print 'Reading from', имя файла с codecs.open (имя файла, режим = 'rt', кодировка = кодировка) как f: печать repr (f.read ())
В этом примере считываются файлы, созданные предыдущей программой, и
печатает представление полученного объекта Unicode в
консоль.
$ python codecs_open_read.py utf-8 Чтение из utf-8.txt u'pi: \ u03c0 ' $ python codecs_open_read.py utf-16 Чтение из utf-16.txt u'pi: \ u03c0 ' $ python codecs_open_read.py utf-32 Чтение из utf-32.txt u'pi: \ u03c0 '
Порядок байтов
Многобайтовые кодировки, такие как UTF-16 и UTF-32, создают проблему, когда
передача данных между различными компьютерными системами, либо путем
копирование файла напрямую или по сети. Разные
системы используют разный порядок байтов старшего и младшего порядка.Этот
характеристика данных, известная как ее порядок байтов , зависит от
такие факторы, как архитектура оборудования и выбор, сделанный
разработчик операционной системы и приложений. Не всегда есть способ
заранее знать, какой порядок байтов использовать для данного набора данных, поэтому
многобайтовые кодировки включают маркер порядка байтов (BOM) в качестве
первые несколько байтов закодированного вывода. Например, UTF-16 определяется
таким образом, что 0xFFFE и 0xFEFF не являются допустимыми символами и могут
использоваться для указания порядка байтов. кодеки определяют константы
для маркеров порядка байтов, используемых UTF-16 и UTF-32.
импортных кодеков из codecs_to_hex импортировать в_hex для имени в ['BOM', 'BOM_BE', 'BOM_LE', 'BOM_UTF8', 'BOM_UTF16', 'BOM_UTF16_BE', 'BOM_UTF16_LE', 'BOM_UTF32', 'BOM_UTF32_BE', 'BOM_UTF32_LE', ]: print '{: 12}: {}'. format (имя, to_hex (getattr (кодеки, имя), 2))
BOM, BOM_UTF16 и BOM_UTF32 автоматически устанавливаются на
соответствующие значения с прямым или обратным порядком байтов в зависимости от
собственный порядок байтов текущей системы.
$ python codecs_bom.py Спецификация: fffe BOM_BE: feff BOM_LE: fffe BOM_UTF8: efbb bf BOM_UTF16: fffe BOM_UTF16_BE: feff BOM_UTF16_LE: fffe BOM_UTF32: fffe 0000 BOM_UTF32_BE: 0000 feff BOM_UTF32_LE: fffe 0000
Порядок байтов определяется и обрабатывается автоматически декодерами в
кодеков, но вы также можете выбрать явный порядок для
кодирование.
импортных кодеков из codecs_to_hex импортировать в_hex # Выберите неродную версию кодировки UTF-16 если кодеки. BOM_UTF16 == кодеки.BOM_UTF16_BE: bom = кодеки.BOM_UTF16_LE кодировка = 'utf_16_le' еще: bom = кодеки.BOM_UTF16_BE кодировка = 'utf_16_be' напечатайте 'Собственный порядок:', to_hex (codecs.BOM_UTF16, 2) print 'Выбранный заказ:', to_hex (bom, 2) # Закодировать текст. encoded_text = u'pi: \ u03c0'.encode (кодировка) print '{: 14}: {}'. format (кодировка, to_hex (encoded_text, 2)) с open ('non-native-encoded.txt', mode = 'wb') как f: # Записать выбранный маркер порядка байтов. Он не входит в # закодированный текст, потому что мы явно указали порядок байтов, когда # выбор кодировки.е. писать (бом) # Записать байтовую строку для закодированного текста. f.write (кодированный_текст)
codecs_bom_create_file.py определяет собственный порядок байтов,
затем явно использует альтернативную форму, чтобы в следующем примере
продемонстрировать автоопределение при чтении.
$ python codecs_bom_create_file.py Собственный порядок: fffe Выбранный заказ: feff utf_16_be: 0070 0069 003a 0020 03c0
codecs_bom_detection. py не указывает порядок байтов при открытии
файл, поэтому декодер использует значение спецификации в первых двух байтах
файл, чтобы определить это.
импортных кодеков из codecs_to_hex импортировать в_hex # Посмотрите на необработанные данные с open ('non-native-encoded.txt', mode = 'rb') как f: raw_bytes = f.read () print 'Raw:', to_hex (raw_bytes, 2) # Снова откройте файл и позвольте кодекам определить спецификацию с codecs.open ('non-native-encoded.txt', mode = 'rt', encoding = 'utf-16') как f: decoded_text = f.read () print 'Decoded:', repr (decoded_text)
Поскольку первые два байта файла используются для порядка следования байтов
обнаружения, они не включаются в данные, возвращаемые read ().
$ python codecs_bom_detection.py Необработанный: feff 0070 0069 003a 0020 03c0 Декодировано: u'pi: \ u03c0 '
Обработка ошибок
В предыдущих разделах указывалось на необходимость знать, какая кодировка
используется при чтении и записи файлов Unicode. Установка кодировки
правильно важно по двум причинам. Если кодировка настроена
некорректно при чтении из файла данные будут интерпретироваться
неверно и может быть поврежден или просто не может декодироваться. Не весь Юникод
символы могут быть представлены во всех кодировках, поэтому при неправильном
кодировка используется при записи будет сгенерирована ошибка, и данные могут
Потерянный.
Кодеки
используют те же пять опций обработки ошибок, что и
обеспечивается методом unicode encode () и
decode () для str.
Режим ошибки | Описание |
---|---|
строгий | Вызывает исключение, если данные не могут быть преобразованы. |
заменить | Заменяет специальный символ маркера для данных, которые не могут быть закодированы. |
игнорировать | Пропускает данные. |
xmlcharrefreplace | Символ XML (только кодировка) |
обратная косая черта заменить | escape-последовательность (только кодирование) |
Ошибки кодирования
Самая распространенная ошибка — получение
UnicodeEncodeError при записи
Данные Unicode в выходной поток ASCII, например в обычный файл или
sys. stdout . Эту программу-пример можно использовать
поэкспериментировать с различными режимами обработки ошибок.
импортных кодеков import sys error_handling = sys.argv [1] текст = u'pi: \ u03c0 ' пытаться: # Сохраняем данные в кодировке ASCII, используя ошибку # режим обработки, указанный в командной строке. с codecs.open ('encode_error.txt', 'w', кодировка = 'ascii', errors = error_handling) как f: f.write (текст) кроме UnicodeEncodeError, ошибка: напечатайте 'ERROR:', err еще: # Если при записи в файл ошибок не было, # показать, что он содержит.с open ('encode_error.txt', 'rb') как f: print 'Содержимое файла:', repr (f.read ())
Хотя строгий режим является самым безопасным для обеспечения безопасности вашего приложения
явно устанавливает правильную кодировку для всех операций ввода-вывода, он может
привести к сбою программы при возникновении исключения.
$ python codecs_encode_error. py строгий ОШИБКА: кодек 'ascii' не может кодировать символ u '\ u03c0' в позиции 4: порядковый номер не в диапазоне (128)
Некоторые другие режимы ошибок более гибкие.Например,
replace гарантирует, что ошибки не возникнут, за счет
возможна потеря данных, которые нельзя преобразовать в запрошенные
кодирование. Символ Юникода для пи по-прежнему не может быть закодирован в
ASCII, но вместо вызова исключения символ заменяется
с участием ? на выходе.
$ python codecs_encode_error.py заменить Содержимое файла: 'pi:?'
Чтобы полностью пропустить данные о проблеме, используйте ignore. Любые данные, которые
не может быть закодирован, просто отбрасывается.
$ python codecs_encode_error.py игнорировать Содержимое файла: 'pi:'
Есть два варианта обработки ошибок без потерь, оба из которых заменяют
персонаж с альтернативным представлением, определенным стандартом
отдельно от кодировки. xmlcharrefreplace использует XML
ссылка на символ в качестве замены (список ссылок на символы
указан в W3C XML Entity Definitions for Characters).
$ python codecs_encode_error.py xmlcharrefreplace Содержимое файла: 'pi: & # 960;'
Другой схемой обработки ошибок без потерь является обратная косая черта.
создает выходной формат, подобный значению, которое вы получаете при печати
repr () объекта Unicode.Символы Юникода
заменен на \ u, за которым следует шестнадцатеричное значение кода
точка.
$ python codecs_encode_error.py обратная косая чертаreplace Содержимое файла: 'pi: \\ u03c0'
Ошибки декодирования
Также можно увидеть ошибки при декодировании данных, особенно если
используется неправильная кодировка.
импортных кодеков import sys из codecs_to_hex импортировать в_hex error_handling = sys.argv [1] текст = u'pi: \ u03c0 ' print 'Original:', repr (текст) # Сохраняем данные в одной кодировке с кодеками.open ('decode_error.txt', 'w', encoding = 'utf-16') как f: f.write (текст) # Дамп байтов из файла с open ('decode_error.txt', 'rb') как f: print 'Содержимое файла:', to_hex (f.read (), 1) # Попытка прочитать данные с неправильной кодировкой с codecs.open ('decode_error.txt', 'r', кодировка = 'utf-8', errors = error_handling) как f: пытаться: data = f.read () кроме UnicodeDecodeError, ошибка: напечатайте 'ERROR:', err еще: print 'Read:', repr (данные)
Как и в случае с кодированием, режим строгой обработки ошибок вызывает исключение.
если поток байтов не может быть правильно декодирован.В этом случае
UnicodeDecodeError результаты из
пытается преобразовать часть спецификации UTF-16 в символ, используя
Декодер UTF-8.
$ python codecs_decode_error.py строгий Оригинал: u'pi: \ u03c0 ' Содержимое файла: ff fe 70 00 69 00 3a 00 20 00 c0 03 ОШИБКА: кодек utf8 не может декодировать байт 0xff в позиции 0: недопустимый начальный байт
При переключении на игнорирование декодер пропускает недопустимые
байты. Однако результат все еще не совсем то, что ожидалось, поскольку
он включает встроенные нулевые байты.
$ python codecs_decode_error.py игнорировать Оригинал: u'pi: \ u03c0 ' Содержимое файла: ff fe 70 00 69 00 3a 00 20 00 c0 03 Прочтите: u'p \ x00i \ x00: \ x00 \ x00 \ x03 '
В режиме замены недопустимые байты заменяются на \ uFFFD,
официальный символ замены Unicode, который выглядит как ромб
на черном фоне с белым вопросительным знаком (�).
$ python codecs_decode_error.py заменить Оригинал: u'pi: \ u03c0 ' Содержимое файла: ff fe 70 00 69 00 3a 00 20 00 c0 03 Прочтите: u '\ ufffd \ ufffdp \ x00i \ x00: \ x00 \ x00 \ ufffd \ x03'
Стандартные потоки ввода и вывода
Наиболее частой причиной исключения UnicodeEncodeError является код, который пытается распечатать
данные Unicode в консоль или конвейер Unix, когда
sys.stdout не настроен с
кодирование.
импортных кодеков import sys текст = u'pi: π ' # Печать в стандартный вывод может вызвать ошибку кодирования print 'Кодировка по умолчанию:', sys.stdout.encoding напечатайте 'TTY:', sys.stdout.isatty () печатать текст
Проблемы с кодировкой по умолчанию для стандартных каналов ввода / вывода могут быть
трудно отлаживать, потому что программа работает должным образом, когда
вывод идет на консоль, но вызывает ошибки кодирования при использовании
как часть конвейера, и вывод включает символы Unicode, указанные выше
диапазон ASCII.Эта разница в поведении вызвана
код инициализации, который устанавливает кодировку по умолчанию для каждого стандарта
Канал ввода / вывода , только если канал подключен к терминалу
(isatty () возвращает True). Если терминала нет, Python
предполагает, что программа явно настроит кодировку, и оставляет
только канал ввода / вывода.
$ python codecs_stdout.py Кодировка по умолчанию: utf-8 TTY: Верно пи: π $ python codecs_stdout.py | кошка - Кодировка по умолчанию: Нет TTY: ложь Отслеживание (последний вызов последний): Файл "codecs_stdout.py ", строка 18, впечатать текст UnicodeEncodeError: кодек ascii не может кодировать символ u '\ u03c0' в позиция 4: порядковый номер вне диапазона (128)
Чтобы явно установить кодировку для стандартного выходного канала, используйте
getwriter (), чтобы получить класс кодировщика потока для определенного
кодирование. Создайте экземпляр класса, передав sys.stdout как единственный
аргумент.
импортных кодеков import sys текст = u'pi: π ' # Оберните sys.stdout писателем, который знает, как обрабатывать кодирование # Данные Unicode.wrapped_stdout = codecs.getwriter ('UTF-8') (sys.stdout) wrapped_stdout.write (u'Via write: '+ текст +' \ n ') # Заменить sys.stdout писателем sys.stdout = обернутый_stdout печать u'Via print: ', текст
При записи в упакованную версию sys.stdout передается Unicode
текст через кодировщик перед отправкой закодированных байтов в стандартный вывод.
Замена sys.stdout означает, что любой код, используемый вашим приложением
который печатает на стандартный вывод, сможет использовать преимущества
кодирующий писатель.
$ python codecs_stdout_wrapped.ру Через запись: pi: π Через печать: пи: π
Следующая проблема, которую необходимо решить, — как узнать, какая кодировка должна быть
используемый. Правильная кодировка зависит от местоположения, языка и
конфигурации пользователя или системы, поэтому жесткое кодирование фиксированного значения не является
хорошая идея. Также было бы неприятно, если бы пользователю пришлось пройти
явные аргументы для каждой программы, устанавливающей ввод и вывод
кодировки. К счастью, есть глобальный способ получить разумную
кодировка по умолчанию с использованием локали.
импортных кодеков импортировать локаль import sys текст = u'pi: π ' # Настроить языковой стандарт в параметрах среды пользователя.locale.setlocale (locale.LC_ALL, '') # Обернуть stdout писателем с поддержкой кодировки. язык, кодировка = locale.getdefaultlocale () print 'Кодировка языка:', кодировка sys.stdout = codecs.getwriter (кодировка) (sys.stdout) print 'With wrapped stdout:', текст
getdefaultlocale () возвращает язык и предпочтительную кодировку
на основе параметров конфигурации системы и пользователя в форме, которая может
использоваться с getwriter ().
$ python codecs_stdout_locale.py Кодировка локали: UTF-8 С обернутым stdout: pi: π
Кодировку также необходимо настроить при работе с sys.stdin . Используйте getreader (), чтобы читатель мог
декодирование входных байтов.
импортных кодеков импортировать локаль import sys # Настроить языковой стандарт в параметрах среды пользователя. locale.setlocale (locale.LC_ALL, '') # Обернуть stdin читателем, учитывающим кодировку. язык, кодировка = locale.getdefaultlocale () sys.stdin = codecs.getreader (кодировка) (sys.stdin) напечатайте 'From stdin:', repr (sys.stdin.read ())
Чтение из обернутого дескриптора возвращает объекты Unicode
вместо экземпляров str.
$ python codecs_stdout_locale.py | Python codecs_stdin.py Из stdin: u 'Локальная кодировка: UTF-8 \ nС упакованным stdout: pi: \ u03c0 \ n'
Сетевые коммуникации
Сетевые сокеты также являются байтовыми потоками, поэтому данные Unicode должны быть
кодируется в байтах перед записью в сокет.
import sys импорт SocketServer класс Echo (SocketServer.BaseRequestHandler): def handle (self): # Получить несколько байтов и передать их клиенту. данные = себя.request.recv (1024) self.request.send (данные) возвращение если __name__ == '__main__': импортировать кодеки импортный сокет импорт потоковой передачи address = ('localhost', 0) # пусть ядро предоставит нам порт server = SocketServer.TCPServer (адрес, эхо) ip, port = server.server_address # узнаем, какой порт нам дали t = threading.Thread (цель = server.serve_forever) t.setDaemon (True) # не зависать при выходе t.start () # Подключиться к серверу s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.connect ((ip, порт)) # Отправляем данные текст = u'pi: π ' len_sent = s.send (текст) # Получите ответ ответ = s.recv (len_sent) напечатать репор (ответ) # Очистить s.close () server.socket.close ()
Вы можете явно закодировать данные перед их отправкой, но пропустите один
вызов send (), и ваша программа не сработает с кодировкой
ошибка.
$ python codecs_socket_fail.py Отслеживание (последний вызов последний): Файл "codecs_socket_fail.py ", строка 43, вlen_sent = s.send (текст) UnicodeEncodeError: кодек ascii не может кодировать символ u '\ u03c0' в позиция 4: порядковый номер вне диапазона (128)
Используя makefile () для получения файлового дескриптора для сокета,
а затем обернув его потоковым читателем или писателем, вы
иметь возможность передавать строки Unicode и знать, что они закодированы в пути
в розетку и из нее.
import sys импорт SocketServer класс Echo (SocketServer.BaseRequestHandler): def handle (self): # Получить несколько байтов и передать их клиенту.Там есть # их не нужно декодировать, так как они не используются. данные = self.request.recv (1024) self.request.send (данные) возвращение класс PassThrough (объект): def __init __ (себя, другое): self.other = другой def write (self, data): print 'Writing:', repr (данные) вернуть self.other.write (данные) def read (self, size = -1): print 'Reading:', data = self.other.read (размер) напечатать репор (данные) вернуть данные def flush (сам): вернуть себя.other.flush () def close (self): вернуть self.other.close () если __name__ == '__main__': импортировать кодеки импортный сокет импорт потоковой передачи address = ('localhost', 0) # пусть ядро предоставит нам порт server = SocketServer.TCPServer (адрес, эхо) ip, port = server.server_address # узнаем, какой порт нам дали t = threading.Thread (цель = server.serve_forever) t.setDaemon (True) # не зависать при выходе t.start () # Подключиться к серверу s = розетка.сокет (socket.AF_INET, socket.SOCK_STREAM) s.connect ((ip, порт)) # Оберните сокет ридером и писателем. input = codecs.getreader ('utf-8') (PassThrough (s.makefile ('r'))) исходящий = codecs.getwriter ('utf-8') (PassThrough (s.makefile ('w'))) # Отправляем данные текст = u'pi: π ' print 'Sending:', repr (текст) исходящий.write (текст) outgoing.flush () # Получите ответ response = incoming.read () print 'Received:', repr (ответ) # Очистить s.close () сервер.socket.close ()
В этом примере используется PassThrough, чтобы показать, что данные
кодируется перед отправкой, а ответ декодируется после того, как он
получил в клиенте.
$ python codecs_socket.py Отправка: u'pi: \ u03c0 ' Написание: 'pi: \ xcf \ x80' Чтение: 'pi: \ xcf \ x80' Получено: u'pi: \ u03c0 '
Преобразование кодировки
Хотя большинство приложений будут работать с данными Unicode
внутренне, декодируя или кодируя его как часть операции ввода-вывода, там
бывают случаи, когда изменяют кодировку файла, не придерживаясь этого
промежуточный формат данных полезен.EncodedFile () открывает
дескриптор файла с использованием одной кодировки и обертывает его классом,
переводит данные в другую кодировку при выполнении ввода-вывода.
из codecs_to_hex импортировать в_hex импортировать кодеки из cStringIO импортировать StringIO # Необработанная версия исходных данных. данные = u'pi: \ u03c0 ' # Вручную закодируйте его как UTF-8. utf8 = data.encode ('utf-8') print 'Начать как UTF-8:', to_hex (utf8, 1) # Настройте выходной буфер, затем оберните его как EncodedFile. вывод = StringIO () encoded_file = кодеки.EncodedFile (вывод, data_encoding = 'utf-8', file_encoding = 'utf-16') encoded_file.write (utf8) # Получить содержимое буфера как байтовую строку в кодировке UTF-16 utf16 = output.getvalue () print 'Закодировано в UTF-16:', to_hex (utf16, 2) # Настроить другой буфер с данными UTF-16 для чтения, # и оберните его другим EncodedFile. буфер = StringIO (utf16) encoded_file = codecs.EncodedFile (буфер, data_encoding = 'utf-8', file_encoding = 'utf-16') # Прочитать версию данных в кодировке UTF-8.recoded = encoded_file.read () напечатайте 'Вернуться в UTF-8:', to_hex (перекодировано, 1)
В этом примере показано чтение и запись в отдельные дескрипторы.
возвращается EncodedFile (). Независимо от того, используется ли ручка
для чтения или записи file_encoding всегда относится к
кодировка, используемая дескриптором открытого файла, переданным в качестве первого аргумента,
а значение data_encoding относится к кодировке, используемой данными
проходя через вызовы read () и write ().
$ python codecs_encodedfile.ру Начать как UTF-8: 70 69 3a 20 cf 80 Закодировано в UTF-16: fffe 7000 6900 3a00 2000 c003 Вернуться к UTF-8: 70 69 3a 20 cf 80
Кодировки без Юникода
Хотя в большинстве предыдущих примеров используются кодировки Unicode,
кодеки могут использоваться для многих других переводов данных. За
Например, Python включает кодеки для работы с base-64, bzip2,
ROT-13, ZIP и другие форматы данных.
импортных кодеков из cStringIO импортировать StringIO буфер = StringIO () stream = codecs.getwriter ('rot_13') (буфер) текст = 'abcdefghijklmnopqrstuvwxyz' ручей.написать (текст) stream.flush () print 'Original:', текст напечатать 'ROT-13:', buffer.getvalue ()
Любое преобразование, которое может быть выражено как функция, принимающая
входной аргумент и возвращение байтовой или Unicode-строки может быть
зарегистрирован как кодек.
$ python codecs_rot13.py Оригинал: abcdefghijklmnopqrstuvwxyz ROT-13: nopqrstuvwxyzabcdefghijklm
Использование кодеков для переноса потока данных обеспечивает более простой интерфейс
чем работать напрямую с zlib.
импортных кодеков из cStringIO импортировать StringIO из codecs_to_hex импортировать в_hex буфер = StringIO () поток = кодеки.getwriter ('zlib') (буфер) text = 'abcdefghijklmnopqrstuvwxyz \ n' * 50 stream.write (текст) stream.flush () print 'Исходная длина:', len (текст) compressed_data = buffer.getvalue () print 'ZIP сжат:', len (compressed_data) буфер = StringIO (сжатые_данные) stream = codecs.getreader ('zlib') (буфер) first_line = stream.readline () print 'Прочитать первую строку:', repr (first_line) uncompressed_data = первая_строка + stream.read () print 'Несжатый:', len (несжатые_данные) print 'Same:', text == uncompressed_data
Не все системы сжатия или кодирования поддерживают чтение
часть данных через потоковый интерфейс, используя
readline () или read (), потому что им нужно найти конец
сжатый сегмент, чтобы расширить его.Если ваша программа не может удерживать
весь несжатый набор данных в памяти, используйте инкрементный доступ
возможности библиотеки сжатия вместо кодеков.
$ python codecs_zlib.py Длина оригинала: 1350 Сжатый ZIP: 48 Прочтите первую строку: 'abcdefghijklmnopqrstuvwxyz \ n' Без сжатия: 1350 То же: Верно
Инкрементное кодирование
Некоторые из представленных кодировок, особенно bz2 и zlib, могут
кардинально меняют длину потока данных по мере работы с ним.Для больших наборов данных эти кодировки лучше работают постепенно,
работая с небольшими порциями данных за раз. В
IncrementalEncoder и IncrementalDecoder API
предназначен для этой цели.
импортных кодеков import sys из codecs_to_hex импортировать в_hex текст = 'abcdefghijklmnopqrstuvwxyz \ n' повторений = 50 print 'Длина текста:', len (текст) print 'Повторы:', повторения print 'Ожидаемая длина:', len (текст) * повторений # Кодировать текст несколько раз, накапливая большой объем данных кодировщик = кодеки.getincrementalencoder ('bz2') () encoded = [] Распечатать print 'Кодировка:', для i в диапазоне (повторения): en_c = encoder.encode (текст, финал = (i == повторы-1)) если en_c: print '\ nEncoded: {} bytes'.format (len (en_c)) encoded.append (en_c) еще: sys.stdout.write ('.') bytes = '' .join (закодировано) Распечатать print 'Общая закодированная длина:', len (байты) Распечатать # Декодировать байтовую строку по одному байту за раз декодер = codecs.getincrementaldecoder ('bz2') () декодировано = [] print 'Декодирование:', для i, b в перечислении (байты): final = (i + 1) == len (текст) c = декодер.декодировать (b, финал) если c: print '\ nDecoded: {} characters'.format (len (c)) print 'Декодирование:', decoded.append (c) еще: sys.stdout.write ('.') Распечатать восстановлено = u ''. join (декодировано) Распечатать print 'Общая длина без сжатия:', len (восстановлено)
Каждый раз, когда данные передаются в кодировщик или декодер, его внутреннее состояние
обновлено. Когда состояние согласовано (как определено кодеком),
данные возвращаются, и состояние сбрасывается. До этого момента звонки
encode () или decode () не вернет никаких данных.Когда
передается последний бит данных, аргумент final должен быть установлен в
Верно, поэтому кодек знает, что нужно очистить все оставшиеся буферизованные данные.
$ python codecs_incremental_bz2.py Длина текста: 27 Повторений: 50 Ожидаемая длина: 1350 Кодировка: ................................................ . Закодировано: 99 байт Общая кодированная длина: 99 Расшифровка: ................................................ ............ ............................ Расшифровано: 1350 символов Расшифровка: .......... Общая длина без сжатия: 1350
Определение собственной кодировки
Поскольку Python уже поставляется с большим количеством стандартных кодеков, он
вряд ли вам нужно будет определять свое собственное. Если да, то там
несколько базовых классов в кодеках, чтобы упростить процесс.
Первый шаг — понять природу преобразования
описывается кодировкой. Например, кодировка invertcaps
преобразует прописные буквы в строчные, а строчные — в
верхний регистр.Вот простое определение функции кодирования, которая
выполняет это преобразование во входной строке:
строка импорта def invertcaps (текст): "" "Вернуть новую строку с измененным регистром всех букв. "" " return '' .join (c.upper (), если c в string.ascii_lowercase иначе c.lower (), если c в string.ascii_uppercase иначе c для c в тексте ) если __name__ == '__main__': напечатать invertcaps ('ABC.def') напечатать invertcaps ('abc.DEF ')
В этом случае кодер и декодер выполняют одну и ту же функцию (как с
РОТ-13).
$ python codecs_invertcaps.py abc.DEF ABC.def
Хотя это легко понять, эта реализация не
эффективен, особенно для очень больших текстовых строк. К счастью,
кодеки включают несколько вспомогательных функций для создания символа
кодеки на основе карты , такие как invertcaps. Кодировка карты символов
состоит из двух словарей. Карта кодировки преобразует символы
значения из входной строки в байтовые значения на выходе и
Карта декодирования идет другим путем.Сначала создайте карту декодирования,
а затем используйте make_encoding_map (), чтобы преобразовать его в кодировку
карта. Функции C charmap_encode () и
charmap_decode () использует карты для преобразования входных данных
эффективно.
импортных кодеков строка импорта # Сопоставьте каждый символ с собой decoding_map = codecs.make_identity_dict (диапазон (256)) # Составьте список пар порядковых значений для нижнего и верхнего регистра # письма pair = zip ([ord (c) вместо c в string.ascii_lowercase], [ord (c) вместо c в строке.ascii_uppercase]) # Измените отображение, чтобы преобразовать верхнее в нижнее и нижнее в верхнее. decoding_map.update (dict ((верхний, нижний) для (нижний, верхний) парами)) decoding_map.update (dict ((нижний, верхний) для (нижний, верхний) парами)) # Создать отдельную карту кодировки. encoding_map = codecs.make_encoding_map (decoding_map) если __name__ == '__main__': печать codecs.charmap_encode ('abc.DEF', 'strict', encoding_map) печать codecs.charmap_decode ('abc.DEF', 'strict', decoding_map) печать encoding_map == decoding_map
Хотя карты кодирования и декодирования для инвертированных колпачков одинаковы,
это может быть не всегда.make_encoding_map () обнаруживает
ситуации, когда более одного входного символа закодированы в один и тот же
выходной байт и заменяет значение кодировки на None, чтобы отметить
кодировка как неопределенная.
$ python codecs_invertcaps_charmap.py ('ABC.def', 7) (u'ABC.def ', 7) Правда
Кодировщик и декодер символьной карты поддерживают все стандартные
методы обработки ошибок, описанные ранее, поэтому вам не нужно ничего делать
дополнительная работа для соответствия этой части API.
импортных кодеков из codecs_invertcaps_charmap импорт encoding_map текст = u'pi: π ' для ошибки в ['игнорировать', 'заменить', 'строгое]: пытаться: закодированные = кодеки.charmap_encode (текст, ошибка, encoding_map) кроме UnicodeEncodeError, ошибка: закодировано = str (ошибка) print '{: 7}: {}'. format (ошибка, закодировано)
Поскольку кодовая точка Unicode для π отсутствует в карте кодирования,
режим строгой обработки ошибок вызывает исключение.
$ Python codecs_invertcaps_error.py игнорировать: ('PI:', 5) replace: ('PI:?', 5) строго: кодек 'charmap' не может кодировать символ u '\ u03c0' в позиции 4: символы отображаются в <не определено>
После того, как определены карты кодирования и декодирования, необходимо установить
создайте несколько дополнительных классов и зарегистрируйте кодировку.register () добавляет функцию поиска в реестр, чтобы при
Пользователь хочет использовать ваши кодеки кодирования, может найти его. В
функция поиска должна принимать единственный строковый аргумент с именем
кодировку и вернуть объект CodecInfo, если он знает
encoding или None, если это не так.
импортных кодеков импортировать кодировки def search2 (кодировка): print 'search2: Поиск:', кодировка return None def search3 (кодировка): print 'search3: Поиск:', кодировка return None кодеки.зарегистрироваться (search2) codecs.register (search3) utf8 = codecs.lookup ('utf-8') напечатайте 'UTF-8:', utf8 пытаться: unknown = codecs.lookup ('без такой-кодировки') кроме LookupError, ошибка: напечатайте 'ERROR:', err
Вы можете зарегистрировать несколько функций поиска, и каждая будет вызываться в
поворачивайте, пока один из них не вернет CodecInfo или пока список не будет исчерпан.
Зарегистрированная кодеками функция внутреннего поиска знает, как
загружать стандартные кодеки, такие как UTF-8, из кодировок, чтобы те
имена никогда не будут переданы в вашу функцию поиска.
$ python codecs_register.py UTF-8: <объект codecs.CodecInfo для кодирования utf-8 в 0x100452ae0> search2: поиск: no-such-encoding search3: Поиск: no-such-encoding ОШИБКА: неизвестная кодировка: нет такой-кодировки
Экземпляр CodecInfo, возвращаемый функцией поиска, сообщает
кодеков, как кодировать и декодировать, используя все различные
поддерживаемые механизмы: без сохранения состояния, инкрементальные и потоковые.
кодеки включают базовые классы, которые делают настройку персонажа
кодирование карты легко.В этом примере все части собираются вместе, чтобы
зарегистрировать функцию поиска, которая возвращает экземпляр CodecInfo
настроен для кодека invertcaps.
импортных кодеков из codecs_invertcaps_charmap импортировать encoding_map, decoding_map # Кодер / декодер без сохранения состояния класс InvertCapsCodec (codecs.Codec): def encode (self, input, errors = 'strict'): return codecs.charmap_encode (ввод, ошибки, encoding_map) def decode (self, input, errors = 'strict'): return codecs.charmap_decode (ввод, ошибки, decoding_map) # Дополнительные формы класс InvertCapsIncrementalEncoder (кодеки.IncrementalEncoder): def encode (self, input, final = False): вернуть codecs.charmap_encode (input, self.errors, encoding_map) [0] класс InvertCapsIncrementalDecoder (codecs.IncrementalDecoder): def decode (self, input, final = False): вернуть codecs.charmap_decode (input, self.errors, decoding_map) [0] # Читатель и писатель потока класс InvertCapsStreamReader (InvertCapsCodec, codecs.StreamReader): проходят класс InvertCapsStreamWriter (InvertCapsCodec, codecs.StreamWriter): проходят # Зарегистрируем функцию поиска кодеков def find_invertcaps (кодировка): "" "Вернуть кодек для invertcaps."" " если кодировка == 'invertcaps': кодеки возврата.CodecInfo ( name = 'invertcaps', encode = InvertCapsCodec (). кодировать, decode = InvertCapsCodec (). декодировать, incrementalencoder = InvertCapsIncrementalEncoder, incrementaldecoder = InvertCapsIncrementalDecoder, streamreader = InvertCapsStreamReader, streamwriter = InvertCapsStreamWriter, ) return None codecs.register (find_invertcaps) если __name__ == '__main__': # Кодер / декодер без сохранения состояния кодировщик = кодеки.getencoder ('инвертировать колпачки') текст = 'abc.DEF' encoded_text, использовано = encoder (текст) print 'Кодировщик преобразовал "{}" в "{}", потребляя {} символов. формат ( текст, кодированный_текст, использованный) # Автор потока import sys Writer = codecs.getwriter ('invertcaps') (sys.stdout) напечатайте 'StreamWriter for stdout:', писатель.write ('abc.DEF') Распечатать # Инкрементальный декодер decoder_factory = codecs.getincrementaldecoder ('invertcaps') декодер = decoder_factory () decoded_text_parts = [] для c в encoded_text: decoded_text_parts.добавить (decoder.decode (c, final = False)) decoded_text_parts.append (decoder.decode ('', final = True)) decoded_text = '' .join (decoded_text_parts) print 'IncrementalDecoder преобразовал "{}" в "{}"'. format ( encoded_text, decoded_text)
Базовым классом кодера / декодера без сохранения состояния является Codec. Переопределить
encode () и decode () с вашей реализацией (в этом
case, вызывая charmap_encode () и charmap_decode ()
соответственно). Каждый метод должен возвращать кортеж, содержащий
преобразованные данные и количество входных байтов или символов
потребляется.Удобно, что charmap_encode () и
charmap_decode () уже возвращает эту информацию.
IncrementalEncoder и IncrementalDecoder служат
базовые классы для дополнительных интерфейсов. Encode () и
decode () инкрементальных классов определены в таких
способ, которым они возвращают только фактические преобразованные данные. любой
информация о буферизации сохраняется как внутреннее состояние. В
Кодировка invertcaps не требует буферизации данных (она использует однозначный
отображение). Для кодировок, которые производят другой объем вывода
в зависимости от обрабатываемых данных, например алгоритмов сжатия,
BufferedIncrementalEncoder и
BufferedIncrementalDecoder — более подходящие базовые классы,
поскольку они управляют необработанной частью ввода за вас.
StreamReader и StreamWriter нуждаются в encode ()
и методы decode () тоже, и поскольку они должны возвращать
то же значение, что и версия из Codec, вы можете использовать несколько
наследование для реализации.
$ python codecs_invertcaps_register.py Кодировщик преобразовал abc.DEF в ABC.def, используя 7 символов. StreamWriter для стандартного вывода: ABC.def IncrementalDecoder преобразовал "ABC.def" в "abc.DEF"
Решение проблем Unicode в Python 2.7
UnicodeDecodeError: кодек ascii не может декодировать байт 0xd1 в позиции 1: порядковый номер не в диапазоне (128) (Почему это так сложно ??)
Одна из самых сложных задач в программе Python — это обработка Unicode.Если вы читаете это, вы, вероятно, пытаетесь это выяснить.
Основные причины, по которым обработка Unicode затруднена в Python, заключается в том, что существующая терминология сбивает с толку и потому, что многие случаи, которые могут быть проблематичными, обрабатываются прозрачно. Это избавляет многих людей от необходимости узнавать, что на самом деле происходит, пока они внезапно не наткнутся на кирпичную стену, когда захотят обработать данные, содержащие символы вне набора символов ASCII.
Если вы только что наткнулись на кирпичную стену Python 2 Unicode, вот три шага, которые вы можете предпринять, чтобы начать правильно думать о строках и Unicode:
1.str предназначена для байтов, а НЕ строк
Первый шаг к решению вашей проблемы Unicode — перестать думать о типе <‘str’> как о хранении строк (то есть последовательностей читаемых человеком символов, также известных как текст). Вместо этого подумайте о типе <‘str’> как о контейнере для байтов. Объекты типа <‘str’> на самом деле вполне могут хранить произвольные последовательности байтов.
Для начала взгляните на строковые литералы в своем коде. Каждый раз, когда вы видите «abc», «abc» или «» «abc» », говорите себе:« Это последовательность из 3 байтов, соответствующих кодам ASCII для букв a, b и c »(технически это UTF-8, но ASCII и UTF-8 одинаковы для латинских букв.
2. Юникод предназначен для строк
Второй шаг на пути к решению вашей проблемы — начать использовать тип <‘unicode’> в качестве контейнера перехода для строк.
Для начала это означает использование префикса «u» для литералов, который будет создавать объекты типа <'unicode'>, а не обычные кавычки, которые будут создавать объекты типа <'str'> (не беспокойтесь о строках документации ; вам редко придется манипулировать ими самостоятельно, в чем обычно и возникают проблемы).Есть и другие передовые методы, о которых я расскажу ниже.
3. UTF-8, UTF-16 и UTF-32 — это форматы сериализации, а НЕ Unicode
.
UTF-8 — это кодировка, аналогичная ASCII (подробнее о кодировках ниже), которая представлена байтами. Разница в том, что кодировка UTF-8 может представлять каждый символ Юникода, а кодировка ASCII — нет. Но они оба по-прежнему байты. Напротив, объект типа <‘unicode’> — это просто объект Unicode. Он не закодирован и не представлен какой-либо конкретной последовательностью байтов.Вы можете думать об объектах Unicode как о хранении абстрактных, платонических представлений текста, в то время как ASCII, UTF-8, UTF-16 и т. Д. — это разные способы сериализации (кодирования) вашего текста.
Хорошо, но почему я не могу использовать str для строк? (Подробное описание проблемы)
Причина перехода разума, описанного выше, заключается в том, что, поскольку тип <'str'> хранит байты, он имеет неявную кодировку , а кодировки (и / или попытки декодирования неправильной кодировки) вызывают большинство проблем с Unicode. в Python 2.
Что я подразумеваю под кодировкой? Это последовательность битов, используемых для представления символов, которые мы читаем. То есть строка «abc» сверху на самом деле сохраняется следующим образом: 01100001 0100010 01100011.
Но есть и другие способы сохранить «abc» — если вы сохраните его в UTF-8, он будет выглядеть точно так же, как версия ASCII, потому что UTF-8 и ASCII одинаковы для латинских букв. Но если вы сохраните «abc» в UTF-16, вы получите 0000000001100001 0000000001100010 0000000001100011.
Кодировки
важны, потому что вы должны использовать их всякий раз, когда текст выходит за пределы вашей программы — если вы хотите записать строку в файл, отправить ее по сети или сохранить в базе данных, она должна иметь кодирование.И если вы отправите неправильную кодировку (то есть последовательность байтов, которую ваш получатель не ожидает), вы получите ошибки Unicode.
Проблема с типом <‘str’> и основная причина, по которой Unicode в Python 2.7 сбивает с толку, заключается в том, что кодирование данного экземпляра типа <‘str’> неявно. Это означает, что единственный способ обнаружить кодировку данного экземпляра типа <‘str’> — это попытаться декодировать последовательность байтов и посмотреть, не взорвется ли она. К сожалению, есть много мест, где байтовые последовательности декодируются незаметно, что может вызвать путаницу и проблемы.Вот несколько примеров строк для демонстрации:
# Установите переменные, которые мы будем использовать >>> uni_greeting = u'Hi, меня зовут% s. ' >>> utf8_greeting = uni_greeting.encode ('utf-8') >>> uni_name = u'José '# Обратите внимание на диакритический знак e. >>> utf8_name = uni_name.encode ('utf-8') # Подключение Unicode к другому Unicode отлично работает >>> uni_greeting% uni_name Привет, меня зовут Josxe9. # Подключение UTF-8 к другой строке UTF-8 тоже работает >>> utf8_greeting% utf8_name «Привет, меня зовут Josxc3xa9.' # Вы можете вставить Unicode в последовательность байтов UTF-8 ... >>> utf8_greeting% uni_name # UTF-8 невидимо декодируется в Unicode; обратите внимание на тип возврата Привет, меня зовут Josxe9. # Но включение строки UTF-8 в Unicode работает не так хорошо ... >>> uni_greeting% utf8_name # Невидимое декодирование в этом направлении не работает. Отслеживание (последний вызов последний): Файл "", строка 1, в UnicodeDecodeError: кодек ascii не может декодировать байт 0xc3 в позиции 3: порядковый номер не в диапазоне (128) # Если вы не вставляете данные, совместимые с ASCII, то есть.>>> uni_greeting% u'Bob'.encode ('utf-8') Привет, меня зовут Боб. # И вы можете полностью забыть об интерполяции строк, если используете UTF-16. >>> uni_greeting.encode ('utf-16')% uni_name Отслеживание (последний вызов последний): Файл " ", строка 1, в ValueError: неподдерживаемый символ формата '' (0x0) в индексе 33 # Ну, вы можете интерполировать utf-16 в utf-8, потому что это просто байтовые последовательности >>> utf8_greeting% uni_name.encode ('utf-16') # Но это бесполезный беспорядок «Привет, меня зовут xffxfeJx00ox00sx00xe9x00».
Приведенные выше примеры должны показать, почему использование типа <‘str’> проблематично; Невидимое декодирование в сочетании с неявным кодированием для типа <‘str’> может скрыть серьезные проблемы. Все будет работать нормально, пока ваш код строго обрабатывает данные ASCII. Затем, однажды, в вашем вводе ошибочно появится «é». Код, который неявно предполагает (и невидимо декодирует) ввод в кодировке ASCII, внезапно столкнется с данными в кодировке UTF-8, и все это может взорваться; даже ваши обработчики исключений могут начать генерировать UnicodeDecodeErrors.
Решение: шлюз Unicode
Лучший способ решить проблему, как и во многих других случаях в Python, — это быть явным. Это означает, что каждая строка, которую обрабатывает ваш код, должна четко трактоваться либо как Unicode, либо как последовательность байтов.
Наиболее систематический способ добиться этого — превратить ваш код в чистую комнату только для Unicode. То есть ваш код должен использовать только объекты Unicode внутри себя; вы даже можете поставить проверки на тип <‘unicode’> в ключевых местах, чтобы сохранить честность.
Затем установите «воздушные шлюзы» в точках входа в ваш код, чтобы гарантировать, что любая последовательность байтов, пытающаяся ввести ваш код, будет правильно облачена в защитный костюм кролика Unicode, прежде чем будет допущена внутрь.
Например:
с f = open ('file.txt'): # BAD - дает вам байты ... с f = codecs.open ('file.txt', encoding = 'utf-8'): # ХОРОШО - дает вам Unicode ...
Это может показаться медленным и громоздким, но на самом деле это довольно просто; большинство известных библиотек Python уже следуют этой практике, поэтому вам обычно нужно беспокоиться только о вводе, поступающем из файлов, сетевых запросах и т. д.
Комплект для строительства шлюза (полезные инструменты Unicode)
Практически любую проблему Unicode можно решить с помощью правильного применения этих инструментов; они помогут вам построить воздушный шлюз, чтобы сохранить внутреннюю часть вашего кода красивой и чистой:
- encode (): Получает от Unicode -> байтов
- decode (): выбирает байты -> Unicode
- codecs.open (encoding = ”utf-8 ″): чтение и запись файлов непосредственно в / из Unicode (вы можете использовать любую кодировку, не только utf-8, но наиболее распространена utf-8).
- u »: превращает строковые литералы в объекты Unicode, а не в байтовые последовательности.
Предупреждение. Не используйте encode () для байтов или decode () для объектов Unicode.
Устранение неполадок
Ключ к устранению ошибок Unicode в Python — знать, какие типы у вас есть. Затем попробуйте следующие шаги:
Если некоторые переменные представляют собой последовательности байтов, а не объекты Unicode, преобразуйте их в объекты Unicode с помощью функции decode () / u »перед их обработкой.
>>> uni_greeting% utf8_name Отслеживание (последний вызов последний): Файл "
", строка 1, в UnicodeDecodeError: кодек ascii не может декодировать байт 0xc3 в позиции 3: порядковый номер не в диапазоне (128) # Решение: >>> uni_greeting% utf8_name.decode ('utf-8') Привет, меня зовут Josxe9. Если все переменные являются последовательностями байтов, вероятно, существует несоответствие кодирования; преобразовать все в объекты Unicode с помощью decode () / u »и повторить попытку.
Если все переменные уже являются Unicode, то часть вашего кода может не знать, как работать с объектами Unicode; либо исправьте код, либо закодируйте в байтовую последовательность перед отправкой данных (и убедитесь, что все возвращаемые значения декодируются обратно в Unicode):
>>> с open ('test.out', 'wb') как f: >>> f.write (uni_name) Отслеживание (последний вызов последний): Файл "
", строка 1, в UnicodeEncodeError: кодек ascii не может кодировать символ u'xe9 в позиции 3: порядковый номер не в диапазоне (128) # Решение: >>> е.написать (uni_name.encode ('utf-8')) # Лучшее решение: >>> с codecs.open ('test.out', 'w', encoding = 'utf-8') как f: >>> f.write (uni_name)
Прочие точки
Python 3 решает эту проблему, становясь более явным: строковые литералы теперь по умолчанию являются Unicode, а байтовые последовательности хранятся в новом типе, называемом «byte».
Чтобы более тщательно изучить эти проблемы, посетите http://docs.python.org/2/howto/unicode.html.
Удачи!
Хотите присоединиться к нашей команде?
Мы стремимся применять геопространственные технологии для гражданского и социального воздействия, продвигая при этом самые современные технологии с помощью исследований.
Узнайте больше о нашей работе над проектами и подпишитесь на уведомления о вакансиях, чтобы первыми узнавать об открытых вакансиях!
« | & quot; | кавычка |
‘ | ‘ | апостроф |
и | & amp; | амперсанд |
< | & lt; | менее |
> | & gt; | больше |
& nbsp; | неразрывной пробел | |
¡ | & iexcl; | перевернутый восклицательный знак |
¢ | и центов; | цент |
£ | & фунт; | фунтов |
¤ | & curren; | валюты |
¥ | иен; | йен |
¦ | & brvbar; | Вертикальная ломаная |
§ | & sect; | раздел |
¨ | & uml; | шаг диэрезиса |
© | & копия; | авторское право |
ª | & ordf; | женский порядковый указатель |
« | & laquo; | угловая кавычка (слева) |
¬ | и нет; | отрицание |
& застенчивый; | мягкий перенос | |
® | и рег; | зарегистрированная торговая марка |
¯ | & macr; | макрон интервала |
° | & deg; | градусов |
± | & plusmn; | плюс-минус |
² | и sup2; | надстрочный 2 |
³ | и sup3; | надстрочный 3 |
´ | и острый; | шаг острый |
мкм | и микро; | микро |
¶ | и пара; | пункт |
· | и миддот; | средняя точка |
¸ | & cedil; | шаг седиль |
¹ | и sup1; | надстрочный 1 |
º | & ordm; | мужской порядковый показатель |
» | & raquo; | угловая кавычка (правая) |
¼ | и frac14; | дробь 1/4 |
½ | и frac12; | дробь 1/2 |
¾ | и frac34; | фракция 3/4 |
¿ | & iquest; | перевернутый вопросительный знак |
× | & раз; | умножение |
÷ | & Разделить; | дивизия |
À | и Агрейв; | заглавная буква а, могильный акцент |
Á | & Aacute; | заглавная а, острый акцент |
 | и Acirc; | заглавная a, с диакритическими знаками с ударением |
à | и Atilde; | заглавная а, тильда |
Ä | и Auml; | заглавная а, марка умляута |
Å | и Aring; | заглавная а, кольцо |
Æ | и AElig; | заглавная ae |
Ç | и Ccedil; | капитал c, седилья |
È | и Эгрейв; | заглавная буква е, акцент могилы |
É | & Eacute; | заглавная е, острый ударение |
Ê | и Ecirc; | заглавная e, ударение с циркумфлексом |
Ë | и Euml; | заглавная е, марка умляута |
Ì | и Игрейв; | заглавная i, могильный акцент |
Í | & Iacute; | заглавная i, острый ударение |
Î | и Icirc; | заглавная i, ударение с циркумфлексом |
Ï | и Iuml; | заглавная i, марка умляута |
ì | & ETH; | capital eth, исландский |
Ñ | и Ntilde; | заглавная n, тильда |
Ò | и Огрейв; | заглавная o, могильный акцент |
Ó | & Oacute; | заглавная o, острый ударение |
Ô | и Ocirc; | заглавная o, ударение с циркумфлексом |
Õ | и Otilde; | заглавная o, тильда |
Ö | и Ouml; | заглавная o, марка умляута |
Ø | и Oslash; | заглавная o, косая черта |
Ù | и Юграва; | заглавная буква u, могильный акцент |
Ú | и Uacute; | заглавная буква u, острый ударение |
Û | и Ucirc; | заглавная буква U, ударение с циркумфлексом |
Ü | и Uuml; | заглавная буква u, марка умляута |
Ý | и Yacute; | заглавная y, острый ударение |
Þ | & THORN; | заглавная буква THORN, исландская |
ß | & szlig; | small sharp s, немецкий |
до | & agrave; | малая а, акцент могильный |
á | & aacute; | малая а, акцент с острым ударением |
â | и acirc; | small a, акцент с циркумфлексом |
г | & atilde; | малая а, тильда |
ä | & auml; | малый а, умляут марка |
смайликов Unicode
для повседневного использования.Все это просто текст, поэтому вы можете их скопировать и вставить.
。◕‿◕。 удивлен и улыбается | 。◕‿‿◕。 улыбающееся лицо кошки | ||
(。◕‿◕。) удивлен и улыбается | (。◕‿‿◕。) улыбающееся лицо кошки | ||
ಠ_ಠ [мем] неодобрительный взгляд | |||
(ಠ_ಠ) неодобрение | |||
٩◔̯◔۶ закатка глаз с поднятыми руками | |||
̳ ̳ ̳ ̳ ͙ ڪ сигарета / перекур | Ƹ̵̡Ӝ̵̨̄Ʒ бабочка | (¬_¬) [японский язык] устал / раздражен | (; 一 _ 一) [японский] позор |
(¬‿¬) [японский] счастливый / мечтающий | (づ  ̄ ³ ̄) づ [японский] хочу поцеловать | ||
ب_ب серьезное / хмурое лицо | |||
﴾͡ ๏ ̯͡ ๏﴿ О’РЛИ? [мем] орли сова | (ノ ◕ ヮ ◕) ノ *: ・ ゚ ✧ [японский] бросание блесток / грац | ||
(ᵔᴥᵔ) [японский] счастливое лицо животного | (• ω •) [яп.] Животное | ☜ (⌒ ▽ ⌒) ☞ [японский] ангел | 〆 (・ ∀ ・ @) [на японском языке] с запиской |
◔ ⌣ ◔ Улыбающееся закатывание глаз | ლ (´ ڡ` ლ) очень доволен, облизывается | ლ, ᔑ • ﺪ͟͠ • ᔐ.ლ злая мама / женщина | ᕙ (⇀‸↼ ‶) ᕗ могучий |
[̲̅ $ ̲̅ (̲̅5̲̅) ̲̅ $ ̲̅] деньги | (づ 。◕‿‿◕。) づ [японский] Привет / подбодрись | ᄽ ὁȍ ̪ őὀ ᄿ паук | |
(╯ ° □ °) ╯︵ ┻━┻ [мем] сердитый, переворачивает стол | ┻━┻ ︵ ヽ (`Д´) ノ ︵ ┻━┻ [мем] двойной стол флип |
┬──┬ ノ (゜ — ゜ ノ) [мем] вернуть стол | (ノ ಠ 益 ಠ) ノ 彡 ┻━┻ [мем] бушует, переворачивает стол |
(╯ ° □ °) ╯︵ (\.о.) \ [мем] флип человек | ┬─┬ ︵ /(.□. \) [мем] В Советской России стол переворачивает |
╭∩╮ (-_-) ╭∩╮ двойной средний палец | 凸 (-_-) 凸 двойной средний палец |
̿ ̿ ̿’̿ ‘\ ̵͇̿̿ \ з = (• _ •) = ε / ̵͇̿̿ /’ ̿’̿ ̿ сдвоенные пистолеты | ⌐╦╦═─ пистолет-пулемет |
(´ ・ ω ・) っ 由 вот мой подарок | (´ ・ ω ・ `) [мем] [японский] лицо с бровями |
٩ (⁎❛ᴗ❛⁎) ۶ счастливое лицо с румянцем и поднятыми руками | (͡ ° ͜ʖ ͡ °) [мем] le lenny face |
¯ \ _ (ツ) _ / ¯ [мем] пожимает плечами / улыбается | (° ͜ʖ °) [мем] жуткое лицо |
¯ \ (° _o) / ¯ [мем] пожимает плечами / Я не знаю LOL | (゚ ヮ ゚) [японский] счастливый / открытый рот |
ヽ ༼ ຈ ل͜ ຈ ༽ ノ Поднимите своих донгеров! | |
┌─┐ [мем] шляпа-цилиндр и монокль | ~~~ ╔͎═͓═͙╗ [мем] нян кот |
• _ •) [мем] надевает солнцезащитные очки (стиль CSI Miami) | / 人 ◕ ‿‿ ◕ 人 \ [аниме] морда животного |
◕‿◕ улыбающийся | 。◕‿◕。 удивлен и улыбается | 。◕‿‿◕。 улыбающееся лицо кошки | ^ ̮ ^ счастливый |
(◕‿◕) улыбается | (。◕‿◕。) удивлен и улыбается | (。◕‿‿◕。) улыбающееся лицо кошки | (^ ̮ ^) счастливый |
ʘ‿ʘ улыбается | ಠ_ಠ [мем] неодобрительный взгляд | ಠ⌣ಠ лукавая улыбка | ಠ‿ಠ коварное лицо |
(ʘ‿ʘ) улыбается | (ಠ_ಠ) неодобрение | (ಠ⌣ಠ) лукавая улыбка | (ಠ‿ಠ) коварное лицо |
♥ ‿ ♥ влюбленные | ◔̯◔ закатка глаз | ٩◔̯◔۶ закатка глаз с поднятыми руками | ⊙﹏⊙ обеспокоен |
̳ ̳ ̳ ̳ ͙ ڪ сигарета / перекур | Ƹ̵̡Ӝ̵̨̄Ʒ бабочка | (¬_¬) [японский язык] устал / раздражен | (; 一 _ 一) [японский] позор |
(・.◤) эмо | ◕‿↼ [японский] подмигнуть | (¬‿¬) [японский] счастливый / мечтающий | (づ  ̄ ³ ̄) づ [японский] хочу поцеловать |
ب_ب серьезное / хмурое лицо | (ಥ﹏ಥ) плачет | ლ (ಠ 益 ಠ ლ) бушует | |
﴾͡ ๏ ̯͡ ๏﴿ О’РЛИ? [мем] орли сова | (ノ ◕ ヮ ◕) ノ *: ・ ゚ ✧ [японский] бросание блесток / грац | ||
(ᵔᴥᵔ) [японский] счастливое лицо животного | (• ω •) [яп.] Животное | ☜ (⌒ ▽ ⌒) ☞ [японский] ангел | 〆 (・ ∀ ・ @) [на японском языке] с запиской |
◔ ⌣ ◔ Улыбающееся закатывание глаз | ლ (´ ڡ` ლ) очень доволен, облизывается | ლ, ᔑ • ﺪ͟͠ • ᔐ.ლ злая мама / женщина | ᕙ (⇀‸↼ ‶) ᕗ могучий |
[̲̅ $ ̲̅ (̲̅5̲̅) ̲̅ $ ̲̅] деньги | (づ 。◕‿‿◕。) づ [японский] Привет / подбодрись | ᄽ ὁȍ ̪ őὀ ᄿ паук | ︻ デ ═ 一 Снайперская винтовка |
(╯ ° □ °) ╯︵ ┻━┻ [мем] сердитый, переворачивает стол | ┻━┻ ︵ ヽ (`Д´) ノ ︵ ┻━┻ [мем] двойной стол флип |
┬──┬ ノ (゜ — ゜ ノ) [мем] вернуть стол | (ノ ಠ 益 ಠ) ノ 彡 ┻━┻ [мем] бушует, переворачивает стол |
(╯ ° □ °) ╯︵ (\.о.) \ [мем] флип человек | ┬─┬ ︵ /(.□. \) [мем] В Советской России стол переворачивает |
╭∩╮ (-_-) ╭∩╮ двойной средний палец | 凸 (-_-) 凸 двойной средний палец |
̿ ̿ ̿’̿ ‘\ ̵͇̿̿ \ з = (• _ •) = ε / ̵͇̿̿ /’ ̿’̿ ̿ сдвоенные пистолеты | ⌐╦╦═─ пистолет-пулемет |
(´ ・ ω ・) っ 由 вот мой подарок | (´ ・ ω ・ `) [мем] [японский] лицо с бровями |
٩ (⁎❛ᴗ❛⁎) ۶ счастливое лицо с румянцем и поднятыми руками | (͡ ° ͜ʖ ͡ °) [мем] le lenny face |
¯ \ _ (ツ) _ / ¯ [мем] пожимает плечами / улыбается | (° ͜ʖ °) [мем] жуткое лицо |
¯ \ (° _o) / ¯ [мем] пожимает плечами / Я не знаю LOL | (゚ ヮ ゚) [японский] счастливый / открытый рот |
ヽ ༼ ຈ ل͜ ຈ ༽ ノ Поднимите своих донгеров! | (︺︹︺) без улыбки |
┌─┐ ┴─┴ ಠ_ರೃ [мем] шляпа-цилиндр и монокль | ~~~ ╔͎═͓═͙╗ [мем] нян кот |
• _ •) (• _ •)> ⌐ ■ — ■ (⌐ ■ _ ■) [мем] надевает солнцезащитные очки (стиль CSI Miami) | / 人 ◕ ‿‿ ◕ 人 \ [аниме] морда животного |
.