今更ながら「mb_convert_kana」の変換する文字列の範囲について調べてみました

# はじめに

ユニコードの文字表を見ていてこんな文字もあるんだな～と思い、「あれ？mb_convert_kanaは実際どこまで変換してくれるの？」と思い検証してみました。
なお、半角カタカナへの変換は検証対象には入っていません。

# 検証内容

ひらがなや全角・半角カタカナ、英数字、記号についてそれぞれどう変換されるかを変換前、変換後の文字列を出力してみます。

検証に使用した文字列は折り返していないので見にくいですがご了承ください
:sweat_smile: 

## 検証コード

```php

$str1 = 'ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｬｭｮｯｰﾞﾟ｡｢｣､･ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾊﾟﾋﾞﾋﾟﾌﾞﾌﾟﾍﾞﾍﾟﾎﾞﾎﾟｳﾞﾜﾞｦﾞ';
$str2 = 'ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヽヾヵヶヷヸヹヺー';
$str3 = 'ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゝゞゕゖー';
$str4 = 'か゛き゛く゛け゛こ゛さ゛し゛す゛せ゛そ゛た゛ち゛つ゛て゛と゛は゛ひ゛ふ゛へ゛ほ゛う゛は゜ひ゜ふ゜へ゜ほ゜カ゛キ゛ク゛ケ゛コ゛サ゛シ゛ス゛セ゛ソ゛タ゛チ゛ツ゛テ゛ト゛ハ゛ヒ゛フ゛ヘ゛ホ゛ウ゛ワ゛ヰ゛ヱ゛ヲ゛ハ゜ヒ゜フ゜ヘ゜ホ゜';
$str5 = 'がぎぐげござじずぜぞだぢづでどばびぶべぼゔぱぴぷぺぽガギグゲゴザジズゼゾダヂヅデドバビブベボヴヷヸヹヺパピプペポ';
$str6 = '！＂＃＄％＆＇（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［＼］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～';
$str7 = '!"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~';
$str8 = 'ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ';
$str9 = '⦅⦆¢£¬¯¦¥₩￨￩￪￫￬￭￮';
$str10 = '｟｠￠￡￢￣￤￥￦│←↑→↓■○';

echo '元の文字列：' . $str1;
echo '<br>';
echo 'KVで変換後：' . mb_convert_kana($str1, 'KV');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str1;
echo '<br>';
echo 'HVで変換後：' . mb_convert_kana($str1, 'HV');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str2;
echo '<br>';
echo 'cで変換後：' . mb_convert_kana($str2, 'c');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str3;
echo '<br>';
echo 'Cで変換後：' . mb_convert_kana($str3, 'C');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str4;
echo '<br>';
echo 'KVで変換後：' . mb_convert_kana($str4, 'KV');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str5;
echo '<br>';
echo 'KVで変換後：' . mb_convert_kana($str5, 'KV');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str6;
echo '<br>';
echo 'aで変換後：' . mb_convert_kana($str6, 'a');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str7;
echo '<br>';
echo 'Aで変換後：' . mb_convert_kana($str7, 'A');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str8;
echo '<br>';
echo 'cで変換後：' . mb_convert_kana($str8, 'c');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str9;
echo '<br>';
echo 'Kで変換後：' . mb_convert_kana($str9, 'K');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str1 . $str4 . $str5;
echo '<br>';
echo 'KVで変換後：' . mb_convert_kana($str1 . $str4 . $str5, 'KV');
echo '<br>';
echo '<br>';
echo '元の文字列：' . $str6 . $str7;
echo '<br>';
echo 'Aaで変換後：' . mb_convert_kana($str6 . $str7, 'Aa');
```

## 出力文字列

### 半角カタカナから全角カタカナへの変換

「KV」で変換してみましたが、本来全角カタカナに含まれているはずの「ヷ・ヺ」が変換されていません

```text
元の文字列：ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｬｭｮｯｰﾞﾟ｡｢｣､･ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾊﾟﾋﾞﾋﾟﾌﾞﾌﾟﾍﾞﾍﾟﾎﾞﾎﾟｳﾞﾜﾞｦﾞ
KVで変換後：アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー゛゜。「」、・ガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポヴワ゛ヲ゛
```

### 半角カタカナからひらがなへの変換

「HV」で変換してみましたが、本来全角ひらがなに含まれているはずの「ゔ」が変換されていません

```text
元の文字列：ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｬｭｮｯｰﾞﾟ｡｢｣､･ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾊﾟﾋﾞﾋﾟﾌﾞﾌﾟﾍﾞﾍﾟﾎﾞﾎﾟｳﾞﾜﾞｦﾞ
HVで変換後：あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわをんぁぃぅぇぉゃゅょっー゛゜。「」、・がぎぐげござじずぜぞだぢづでどばぱびぴぶぷべぺぼぽう゛わ゛を゛
```

### 全角カタカナからひらがなへの変換

「c」で変換してみましたが、「ヴヽヾヵヶ」は変換されていません。また、ひらがなに無い「ヷヸヹヺ」も変換されていません。~~は文字と濁点に展開して欲しい所ですがこれもそのままです。~~

```text
元の文字列：ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヽヾヵヶヷヸヹヺー
cで変換後：ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんヴヽヾヵヶヷヸヹヺー
```

### ひらがなから全角カタカナへの変換

「C」で変換してみましたが、「ゔゝゞゕゖ」は変換されていません。

```text
元の文字列：ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゝゞゕゖー
Cで変換後：ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンゔゝゞゕゖー
```

### 濁点・半濁点の結合「U+309B」「U+309C」

一文字として表示される「濁点」「半濁点」の検証です。
「V」は「"K", "H" と共に使用します。」とマニュアルに記載されていますが、やはり半角カタカナからの変換の時以外には何も変換されないようです。

```text
元の文字列：か゛き゛く゛け゛こ゛さ゛し゛す゛せ゛そ゛た゛ち゛つ゛て゛と゛は゛ひ゛ふ゛へ゛ほ゛う゛は゜ひ゜ふ゜へ゜ほ゜カ゛キ゛ク゛ケ゛コ゛サ゛シ゛ス゛セ゛ソ゛タ゛チ゛ツ゛テ゛ト゛ハ゛ヒ゛フ゛ヘ゛ホ゛ウ゛ワ゛ヰ゛ヱ゛ヲ゛ハ゜ヒ゜フ゜ヘ゜ホ゜
KVで変換後：か゛き゛く゛け゛こ゛さ゛し゛す゛せ゛そ゛た゛ち゛つ゛て゛と゛は゛ひ゛ふ゛へ゛ほ゛う゛は゜ひ゜ふ゜へ゜ほ゜カ゛キ゛ク゛ケ゛コ゛サ゛シ゛ス゛セ゛ソ゛タ゛チ゛ツ゛テ゛ト゛ハ゛ヒ゛フ゛ヘ゛ホ゛ウ゛ワ゛ヰ゛ヱ゛ヲ゛ハ゜ヒ゜フ゜ヘ゜ホ゜
```

### 濁点・半濁点の結合「U+3099」「U+309A」

一文字の濁点・半濁点付き文字に見えるかもしれませんが、コピーしてエディタなどで確認すると二文字になっている「濁点」「半濁点」の検証です。
「V」は「"K", "H" と共に使用します。」とマニュアルに記載されていますが、やはり半角カタカナからの変換の時以外には何も変換されないようです。

```text
元の文字列：がぎぐげござじずぜぞだぢづでどばびぶべぼゔぱぴぷぺぽガギグゲゴザジズゼゾダヂヅデドバビブベボヴヷヸヹヺパピプペポ
KVで変換後：がぎぐげござじずぜぞだぢづでどばびぶべぼゔぱぴぷぺぽガギグゲゴザジズゼゾダヂヅデドバビブベボヴヷヸヹヺパピプペポ
```

### 全角英数字から半角英数字への変換

「a」で変換してみましたが、マニュアルにもあるとおり、「＂＇＼～」は変換されません。

```text
元の文字列：！＂＃＄％＆＇（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［＼］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～
aで変換後：!＂#$%&＇()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[＼]^_`abcdefghijklmnopqrstuvwxyz{|}～
```

### 半角英数字から全角英数字への変換

「A」で変換してみましたが、マニュアルにもあるとおり、「" ' \\ ~」は変換されません。

```text
元の文字列：!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Aで変換後：！"＃＄％＆'（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［\］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝~
```

### アイヌ語などで使用される小文字のカタカナ

「c」で変換してみましたが当然のごとく何もおきませんでした。

```text
元の文字列：ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
cで変換後：ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
```

### 半角・全角を持つその他記号

「[Unicode 半角・全角形](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/uff00.html)」にある半角の記号を「K」で変換してみましたが当然のごとく何もおきませんでした。

```text
元の文字列：⦅⦆¢£¬¯¦¥₩￨￩￪￫￬￭￮
Kで変換後：⦅⦆¢£¬¯¦¥₩￨￩￪￫￬￭￮

全角形：｟｠￠￡￢￣￤￥￦│←↑→↓■○
```

### 半角カタカナと濁点・半濁点が分離したカタカナ・ひらがな混在時の「KV」

濁点・半濁点が分離したカタカナ・ひらがなは、やはり結合されないようです。

「V」は単独で動作しているわけではなく、オプション文字列に「K」もしくは「H」が存在したときに半角カタカナ専用の変換マップを使用して変換を行っているようです。

検証コードには載せていませんが、オプション文字列に「K」「H」「V」がすべて含まれている場合は順番にかかわらず「KV」の変換となるようです。

```text
元の文字列：ｱｲｳｴｵｶｷｸｹｺｻｼｽｾｿﾀﾁﾂﾃﾄﾅﾆﾇﾈﾉﾊﾋﾌﾍﾎﾏﾐﾑﾒﾓﾔﾕﾖﾗﾘﾙﾚﾛﾜｦﾝｧｨｩｪｫｬｭｮｯｰﾞﾟ｡｢｣､･ｶﾞｷﾞｸﾞｹﾞｺﾞｻﾞｼﾞｽﾞｾﾞｿﾞﾀﾞﾁﾞﾂﾞﾃﾞﾄﾞﾊﾞﾊﾟﾋﾞﾋﾟﾌﾞﾌﾟﾍﾞﾍﾟﾎﾞﾎﾟｳﾞﾜﾞｦﾞか゛き゛く゛け゛こ゛さ゛し゛す゛せ゛そ゛た゛ち゛つ゛て゛と゛は゛ひ゛ふ゛へ゛ほ゛う゛は゜ひ゜ふ゜へ゜ほ゜カ゛キ゛ク゛ケ゛コ゛サ゛シ゛ス゛セ゛ソ゛タ゛チ゛ツ゛テ゛ト゛ハ゛ヒ゛フ゛ヘ゛ホ゛ウ゛ワ゛ヰ゛ヱ゛ヲ゛ハ゜ヒ゜フ゜ヘ゜ホ゜がぎぐげござじずぜぞだぢづでどばびぶべぼゔぱぴぷぺぽガギグゲゴザジズゼゾダヂヅデドバビブベボヴヷヸヹヺパピプペポ
KVで変換後：アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー゛゜。「」、・ガギグゲゴザジズゼゾダヂヅデドバパビピブプベペボポヴワ゛ヲ゛か゛き゛く゛け゛こ゛さ゛し゛す゛せ゛そ゛た゛ち゛つ゛て゛と゛は゛ひ゛ふ゛へ゛ほ゛う゛は゜ひ゜ふ゜へ゜ほ゜カ゛キ゛ク゛ケ゛コ゛サ゛シ゛ス゛セ゛ソ゛タ゛チ゛ツ゛テ゛ト゛ハ゛ヒ゛フ゛ヘ゛ホ゛ウ゛ワ゛ヰ゛ヱ゛ヲ゛ハ゜ヒ゜フ゜ヘ゜ホ゜がぎぐげござじずぜぞだぢづでどばびぶべぼゔぱぴぷぺぽガギグゲゴザジズゼゾダヂヅデドバビブベボヴヷヸヹヺパピプペポ
```

### 「Aa」とした時の変換

全角の部分が半角に、半角の部分が全角になっています。

検証コードには載せていませんが、「Rr」「Nn」「Ss」の際にも同じように全角の部分が半角に、半角の部分が全角に変換されます。

```text
元の文字列：！＂＃＄％＆＇（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［＼］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝～!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
aで変換後：!＂#$%&＇()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[＼]^_`abcdefghijklmnopqrstuvwxyz{|}～！"＃＄％＆'（）＊＋，－．／０１２３４５６７８９：；＜＝＞？＠ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ［\］＾＿｀ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ｛｜｝~
```

## まとめ

案外変換されない文字も多いなと感じましたし、濁点・半濁点についてはデータベースで検索をかける際には注意が必要になるなと感じました。まぁ、「そんな文字入力するなよ！」とも思いますが... :sweat: