chacha_cha11
@chacha_cha11

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

見た目は同じ文字なのに文字コードは異なるのはなぜ

疑問点

ブタ
ブタ

見た目は同じに見えるのにデコードすると

%E3%83%96%E3%82%BF
%E3%83%95%E3%82%99%E3%82%BF

このように異なります

二つ目のブはMacで入力することができず悩んでいます。
なぜ見た目は同じなのに文字コードが異なってしまうのでしょうか?

2

2Answer

Unicode は文字合成の仕組みがあり、同じ文字に対して複数の表現が割り当てられる場合もあります。 しかしそれでは何かと不都合なので一貫した表現方法に揃える正規化の規則として以下の四種類を規定しています。

  • NFD
  • NFC
  • NFKD
  • NFKC

ただし、これらはソフトウェア内部で文字というものをどう扱うべきかのガイドラインであって、どれかの規則に基づいて正規化しなければならないことを要求するものではありませんし、正規化をしないという選択をしてもかまわないのです。

macOS はファイルシステムが NFD (の変種) を採用しているそうで、ファイル名は NFD になります。 そういう事情があるので他の部分でも NFD を基本にしていたりはするのでしょう。 テキストファイル内の文字列についてであれば、エディタによっては正規化を選択して保存する機能があったりもすると思うのでそういったエディタを探してみてはいかがでしょうか。 (私自身は macOS を使っていないので具体的に提示できないのですが。)

%E3%83%96%E3%82%BF%E3%83%95%E3%82%99%E3%82%BF を同じ文字列とみなさなければならない場面であればそのように処理する機能をソフトウェアに実装しなければなりません。 文字の分解・合成は短いアルゴリズムで表せるものではなく、巨大な表が使われます。 OS / ミドルウェア / ライブラリが上手いこと処理する機能を持っていたりすることが多いので (Unicode で表された) 文字列を扱うプログラムを書く場合には無理して自分で処理しようとせずになるべく OS やミドルウェアの機能を頼るのが望ましいでしょう。

4Like

Comments

  1. @chacha_cha11

    Questioner

    ご丁寧にありがとうございます!
    同じ文字列としてみなしたいと思いましたが実装しなければいけないのですねmm
    今回は実装自体は諦めようと思います。
    付随する知識までご教授いただきありがとうございました!!

一つ目の『ブ』は文字コード一文字分ですが,二つ目の『ブ』は『フ+濁点』の二文字分相当の文字コードで表現されていますね.当方Mac使いではないのですが,macOSではむしろ二つ目の二文字分相当で自動的に統一(正規化)されると聞いたことがあります.両方入力したい場合は…文字表示サイトからのコピペが一番楽なのでしょうか….

1Like

Comments

  1. @chacha_cha11

    Questioner

    ありがとうございます!
    >macOSではむしろ二つ目の二文字分相当で自動的に統一(正規化)される
    こちら全然知りませんでした、、
    今回はコピペで対応をいたしましたmmご回答ありがとうございました!

Your answer might help someone💌