「利用者:Kirari1192」の版間の差分
ナビゲーションに移動
検索に移動
編集の要約なし
>Kirari1192 編集の要約なし |
>Kirari1192 編集の要約なし |
||
319行目: | 319行目: | ||
正規表現はもっと奥深い世界なので興味を持った芋はもっと調べてみることを切に望む<ref>取材注: なお当の部員はHTMLの正規表現とHTMLの2つとにらめっこして頭の中でマッチとか修正したり、HTMLやその他コードを見て正しく切り出せるであろう正規表現で一発で書けるらしい。バケモンか?</ref>。 | 正規表現はもっと奥深い世界なので興味を持った芋はもっと調べてみることを切に望む<ref>取材注: なお当の部員はHTMLの正規表現とHTMLの2つとにらめっこして頭の中でマッチとか修正したり、HTMLやその他コードを見て正しく切り出せるであろう正規表現で一発で書けるらしい。バケモンか?</ref>。 | ||
=== 2022/11/ | === 2022/11/4 文字列? バイト配列? エンコーディング? === | ||
文字化けはインターネットで日本語に限らずマルチバイト文字が関係する環境であれば誰でも見たことがあると思うナリ<br> | |||
"蜚先セ、雋エ豢区ョコ縺�" 文字化けだからセーフ | |||
文字化けはなぜ起こるナリか? 理由は簡単で出力したときのエンコーディングと読み込むときのエンコーディングが違うからナリ<br> | |||
今回は文字列とバイト配列の違い、そしてエンコーディングがどう関わってくるかについて考えるナリ<br> | |||
今回はPythonだけとさせて頂くナリ とりあえず取り急ぎ | |||
==== 文字列 ==== | |||
[[唐澤貴洋|????]]「まずは『文字列』について考えるナリ。これは何ナリか」 | |||
文字列は一繋がりの文字の並びを指すナリ。例えば"唐澤貴洋Wiki"は文字列ですを<br> | |||
別の観点から見れば文字配列のようにも考えることができますを<ref>Cでは正にそのようになる。また他の言語でも内部的には文字型の配列を持っていることが珍しくなく、Java 9以前のJavaはその一例と言える</ref> | |||
"文字"を数値と見ると、よくあるものは16ビット数値<ref>Goのように文字型が32ビットになる言語も存在する。</ref>として見なすナリ<br> | |||
これは文字コード<ref>大体Unicodeである</ref>を直接記憶するためにその程度のビット数を確保する必要があるからですを | |||
(Python) | |||
>>> ord('唐') | |||
21776 | |||
>>> ord('澤') | |||
28580 | |||
>>> ord('貴') | |||
36020 | |||
>>> ord('洋') | |||
27915 | |||
>>> ord('殺') | |||
27578 | |||
>>> ord('す') | |||
12377 | |||
==== バイト配列 ==== | |||
バイト配列は一繋がりのバイトの並びを指すナリ バイト(byte)とは通常は8ビット数値<ref>通常は、と書いたのは7ビットや9ビットの環境もあるという意味だが、これらは主にメインフレームなどで使われているものであるため考えない</ref>を指し、符号付き(signed)では-127~127、符号なし(unsigned)では0~255までの範囲を表せる数値型ナリ | |||
Pythonでは文字列(str)とバイト配列(bytes/bytearray)が非常に似た型になっていて紛らわしいナリが本来は全くの別物ナリ | |||
この表現はファイルに書き込んだり、外部と通信する時に使いますを | |||
(Python) | |||
>>> b'I will kill Takahiro Karasawa' | |||
b'I will kill Takahiro Karasawa' | |||
>>> b'I will kill Takahiro Karasawa'.hex() | |||
'492077696c6c206b696c6c2054616b616869726f204b61726173617761' | |||
1バイトを16進数にすると丁度2文字になるので色々と都合の良い表現と言えるのが特徴ナリね | |||
==== エンコーディング ==== | |||
では文字列をファイルに書き出したい時はどうするかについて考えるナリ<br> | |||
文字そのものをファイルに書き出すとは言ってもバイト配列に変換しなければならないナリ | |||
その文字列をバイト配列に変換する方式のことをエンコーディング(encoding)と言いますを<br> | |||
このエンコーディングが出力時と読み込み時で異なると文字化けするナリよ | |||
(Python) | |||
>>> '唐澤貴洋殺す'.encode('euc-jp').decode('sjis') | |||
'ナ籬キオョヘホサヲ、ケ' | |||
一例として[[唐澤貴洋殺す]]を色々なエンコーディングで表現したらこのようになるナリ (bytesのままでは見づらいため16進数に変換) | |||
(Python) | |||
>>> for enc in ('utf-8', 'utf-16', 'sjis', 'euc-jp'): | |||
... print(f'{enc}: {"唐澤貴洋殺す".encode(enc).hex()}') | |||
... | |||
utf-8: e59490e6bea4e8b2b4e6b48be6aebae38199 | |||
utf-16: fffe1055a46fb48c0b6dba6b5930 | |||
sjis: 9382e0568b4d976d8e4582b7 | |||
euc-jp: c5e2dfb7b5aecdcebba6a4b9 | |||
日本語のウェブサイトでも今はUTF-8が主流ナリが過去にはShift-JISやEUC-JPが主流だった時代もあり、エンコーディングというのは現代では非常に重要な概念になっているのは間違いないですを | |||
== 脚注 == | == 脚注 == | ||
<references /> | <references /> |