Shift_JIS文化からUTF-8への移行ガイド

まだまだ場所によってはShift_JIS文化は根強く、2015年が終わろうとしている現在でも、「ようやく我が社もUnicodeでシステムを作ることを考えるっ！」なんてところは多くあるかと思います。

そんな現場で、これまでJavaでShift_JISでシステム構築してきたSIer向けのUTF-8移行ガイドです。

## 文字長のチェック

文字長の入力チェックはShift_JISの世界では、半角文字は1バイト、全角文字は2バイトなので、以下のようなチェックロジックになっていたかと思います。

```java
if (inputValue.getBytes("Windows-31j").length > 20) {
    errors.add("hoge", new ActionMessage("errors.maxlength", "ほげ", 10));   
}
```

UTF-8ではそれらの文字は、1バイト～3バイトで表されるので、バイトでの文字長の数え方は変わってきます。
そもそも、なぜ入力文字長の制限を設けるのでしょうか。セキュリティ的な配慮をのぞけば、

1. 入力された文字をデータベースに格納するため。
2. グリッドレイアウトの帳票やラベル印刷で表示エリアからはみ出さないようにするため。

の2点のためと思われます。2はフォントに依存する非常に厄介な問題です。長くなるのでここでは取り扱いませんが、文字長の仕様を決める際には単にデータベース設計に合わせればよい、とはいかないことは念頭においておく必要があります。

さて、1に関しての詳しい話は別記事で書く予定([書きました](http://qiita.com/kawasima/items/e958adb75cfd64be45fd))ですが、データベースのUnicode対応は日本のWebアプリケーションのUTF-8化に先駆けて行われています。したがって、Unicode対応のテーブルにデータを格納することを考えれば、バイト長でのチェックは必要なくなります。

文字長の仕様は、バイト長で決めるのではなく文字数で決めればよいということです。
先ほどのコードはシンプルに、以下のように書けることでしょう。

```java
if (inputValue.length() > 10) {
    errors.add("hoge", new ActionMessage("errors.maxlength", "ほげ", 10));   
}
```

めでたし、めでたし

とする前に考えておかなきゃいけない問題があります。

### サロゲートペア

サロゲートペアとは何であるかは、[Wikipedia](http://ja.wikipedia.org/wiki/Unicode#.E3.82.B5.E3.83.AD.E3.82.B2.E3.83.BC.E3.83.88.E3.83.9A.E3.82.A2)を参照いただくとして、これはUTF-8エンコーディングで1文字で4バイト以上使う文字のことを指します。

サロゲートペアの文字で有名なものは「𠮷野家」の𠮷で、[吉野家HDと高島屋が日本語UTF-8メール普及コンソーシアムを設立](http://it.slashdot.jp/story/12/03/31/2322209/%E5%90%89%E9%87%8E%E5%AE%B6HD%E3%81%A8%E9%AB%98%E5%B3%B6%E5%B1%8B%E3%81%8C%E6%97%A5%E6%9C%AC%E8%AA%9EUTF-8%E3%83%A1%E3%83%BC%E3%83%AB%E6%99%AE%E5%8F%8A%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%82%B7%E3%82%A2%E3%83%A0%E3%82%92%E8%A8%AD%E7%AB%8B)なんて話があります。

これの何が問題かというと

```clj
=> (.length "𠮷野家")
4
```

と単にString.lengthメソッドを使うと𠮷は2文字と判定されてしまうのです。3文字で入力してるのに、「3文字で入力してください」っていうエラーがでるっちゅうねん、ってことになりかねません。

このためJavaではString.codePointCountという別のメソッドが用意されています。

```clj
=> (.codePointCount "𠮷野家" (.length "𠮷野家"))
3
```
とやってあげると、見た目通りの文字数が取得できます。

ちなみに他の言語ではどうなのでしょうか? rubyは

```irb
=> "𠮷野家".length
3
```

と、特に[何もしなくても正しくカウントできます](http://www.atmarkit.co.jp/news/200712/25/ruby.html)。スバラシイ :smile:

### 結合文字

日本語では、通常の使い途においては、ここまで考えておけば十分かと思いますが、海外で使うシステムを考えると、あともうひとつ結合文字について考慮しておく必要があります。

結合文字は、ざっくりいうと見た目は1文字に見えるけれども、複数の文字から構成されるものです。

いたずら用としては、

た͜͜͏̘̣͔͙͎͎̘̜̫̗͍͚͓͜͜͏̘̣͔͙͎͎す͜͜͏̘̣͔͙͎͎ơ̟̤̖̗͖͇̍͋̀͆̓́͞͡け̜ͪ̅̍̅͂͊て




が有名ですね。

真面目にアジア圏の文字では、この結合文字が使われることがあり、ユーザは1文字のつもりで入力します。したがって、これは1文字と数えたい。そうなると``結合文字を1文字に正規化できるのであれば、1文字として扱う``が、一般的な取り扱いかと思います。Javaの場合、

```
Normalizer.normalize(str, Normalizer.Form.NFC);
```

と、正規化してから文字数を数えればよいでしょう。

### コードのまとめ

文字の取り扱いは、いろんな文字が入力されるTwitterに、ノウハウが多くあると思われます。そんなノウハウが[twitter-text](https://github.com/twitter/twitter-text/)ライブラリとして公開されていますので、これを見るとよいかと思います。

Javaによる文字長は、以下のようにして計算されています。

https://github.com/twitter/twitter-text/blob/master/java%2Fsrc%2Fcom%2Ftwitter%2FValidator.java

```Java
 public int getTweetLength(String text) {
    text = Normalizer.normalize(text, Normalizer.Form.NFC);
    int length = text.codePointCount(0, text.length());

    for (Extractor.Entity urlEntity : extractor.extractURLsWithIndices(text)) {
      length += urlEntity.start - urlEntity.end;
      length += urlEntity.value.toLowerCase().startsWith("https://") ? shortUrlLengthHttps : shortUrlLength;
    }

    return length;
  }
```

urlEntityのところはTweet中のURLを短縮して計算するロジックなので、結合文字を正規化して、コードポイントを数えるという、上で説明したやり方がなされていることがわかります。

## 空白文字の扱い

Shift_JIS時代の「半角スペースと全角スペースをトリミング」という仕様。全角スペースとはなにか、というところから問い直す必要があります。

空白文字っぽいものが、Unicodeにはたくさんあります。
http://qiita.com/suin/items/1a878dd3c7e7a4b14039

これも、前述のtwitter-textを見ると扱いがわかりますが、そこでは以下のように定義しています。

```java
private static final String UNICODE_SPACES = "[" +
    "\\u0009-\\u000d" +     //  # White_Space # Cc   [5] <control-0009>..<control-000D>
    "\\u0020" +             // White_Space # Zs       SPACE
    "\\u0085" +             // White_Space # Cc       <control-0085>
    "\\u00a0" +             // White_Space # Zs       NO-BREAK SPACE
    "\\u1680" +             // White_Space # Zs       OGHAM SPACE MARK
    "\\u180E" +             // White_Space # Zs       MONGOLIAN VOWEL SEPARATOR
    "\\u2000-\\u200a" +     // # White_Space # Zs  [11] EN QUAD..HAIR SPACE
    "\\u2028" +             // White_Space # Zl       LINE SEPARATOR
    "\\u2029" +             // White_Space # Zp       PARAGRAPH SEPARATOR
    "\\u202F" +             // White_Space # Zs       NARROW NO-BREAK SPACE
    "\\u205F" +             // White_Space # Zs       MEDIUM MATHEMATICAL SPACE
    "\\u3000" +             // White_Space # Zs       IDEOGRAPHIC SPACE
  "]";
```

したがって、これらをトリム対象とすれば、ちゃんと空白っぽい文字を削除できます。

## Charsetの変換

他システムとのファイル連携する場合などは、UTF-8以外のCharsetへの/からの変換があります。自システムだけUTF-8にしても、連携先がShift_JISの場合やっぱり問題が起こることがあります。

最近ではあまり見かけることは少なくなりましたが、Java黎明期にはみんなハマった経験がある、Shift_JISからの変換で発生する波ダッシュ問題が有名です。

### Shift_JIS系Charset

JavaにはShift＿JISファミリーのCharsetが複数存在し、これらを相互運用するときに問題を起こします。

|Charset|別名|説明|
|:------|:---|:-------|
|Shift_JIS|shift_jis, x-sjis, sjis, shift-jis, ms_kanji, csShiftJIS|最初のShift_JIS|
|windows-31j|MS932 windows-932 csWindows31J|Windowsで使われる|
|x-IBM943c|943C, cp943C, ibm943C, ibm-943C|AIXやDB2でよく使われる|

他にもShift_JISのバージョンが、JavaのCharsetには存在しますが、よく使われる上記3つを中心に説明します。

### 波ダッシュ問題

Shift_JISの拡張がwindows-31jなので、使える文字集合が異なるという点に注意しなくてはならないのですが、厄介なのは「〜」のUnicodeマッピングが、同じShift_JISファミリーなのに異なることです。

〜(波ダッシュ)は、Shift_JISでもwindows-31jでも、8160で表されますが、Unicodeへのマッピングが以下のとおり異なります。

|Charset|Unicode|
|:--------|:-----|
|Shift_JIS|U+301c|
|windows-31j|U+ff5e|

そして、それぞれU+ff5eのShift_JISエンコーディング、U+301cのwindows-31jエンコーディングともに未定義なので、Java内で「〜」のShift_JIS <-> windows-31jの変換で文字化けしてしまうということになります。

### windows-31jとcp943cの違い

IBM系で固められたシステムとやりとりする場合、相手先のCharsetはcp943cであることが多いです。windows-31jとcp943cでは、Unicodeとのマッピングに以下の差異があります。

|文字|コードポイント|windows-31j|cp943c|
|:--:|:--|:--|:--|
|¢|U+00a2|8191|-|
|£|U+00a3|8192|-|
|¦|U+00a6|-|fa55|
|«|U+00ab|81e1|-|
|¬|U+00ac|81ca|-|
|¯|U+00af|8150|-|
|µ|U+00b5|83ca|-|
|·|U+00b7|8145|-|
|¸|U+00b8|8143|-|
|»|U+00bb|81e2|-|
|—|U+2014|-|815c|
|―|U+2015|815c|-|
|‖|U+2016|-|8161|
|№|2116|8782|fa59|
|℡|2121|8784|fa5a|
|Ⅰ|2160|8754|fa4a|
|Ⅱ|2161|8755|fa4b|
|Ⅲ|2162|8756|fa4c|
|Ⅳ|2163|8757|fa4d|
|Ⅴ|2164|8758|fa4e|
|Ⅵ|2165|8759|fa4f|
|Ⅶ|2166|875a|fa50|
|Ⅷ|2167|875b|fa51|
|Ⅸ|2168|875c|fa52|
|Ⅹ|2169|875d|fa53|
|−|2212|-|817c|
|∥|2225|8161|-|
|〜|301c|-|8160|
|ゔ|3094|8394|-|
|㈱|U+3231|878a|fa58|
|－|ff0d|817c|-|
|～|ff5e|8160|-|
|￤|ffe4|fa55|-|

この表の作り方は、[こちら](http://qiita.com/kawasima/items/398947cb28d5558352ed)をご覧ください。

波ダッシュ問題を解消しても、「ゔ」はcp943cでは対応する文字がないので、文字化けします。

## 文字種のチェック

結局、他のShift_JIS文化のシステムとデータをやりとりすることを考えると、自システム内では、UTF-8で保存するものの、相手先にデータを渡すときにShift_JISでエンコードする必要があります。
そうなると、自システム内でも受け付けることのできる文字範囲をShift_JISに限る、なんてことはよくあります。

しかし、Unicodeのコードポイントの並びとShift_JISの文字の並びは、かなり異なるため単純な正規表現は書けません。この場合Shift_JISの許容文字をSetに持っておいて、入力文字列を一文字ずつcontainsしていくのが、力技な感じですが現実的なバリデーションロジックになるでしょう。

正規表現でいくんだぜー、という方はwindows-31jの文字範囲で正規表現を作ってみましたのでどうぞ。

```javascript
/^[§-¨°-±´¶×÷Α-ΡΣ-Ωα-ρσ-ωЁА-яё‐―‘-’“-”†-‡‥-…‰′-″※℃№℡ÅⅠ-Ⅹⅰ-ⅹ←-↓⇒⇔∀∂-∃∇-∈∋∑√√∝-∠∠∥∧-∩∩-∪∪-∫∫-∬∮∴-∵∵∽≒≒≠-≡≡≦-≧≪-≫⊂-⊃⊆-⊇⊥⊥⊿⌒①-⑳─-┃┌┏-┐┓-└┗-┘┛-┝┠┣-┥┨┫-┬┯-┰┳-┴┷-┸┻-┼┿╂╋■-□▲-△▼-▽◆-◇○◎-●◯★-☆♀♂♪♭♯　-〃々-〕〝〟ぁ-ん゛-ゞァ-ヶ・-ヾ㈱-㈲㈹㊤-㊨㌃㌍㌔㌘㌢-㌣㌦-㌧㌫㌶㌻㍉-㍊㍍㍑㍗㍻-㍾㎎-㎏㎜-㎞㎡㏄㏍一-丁七万-下不-与丐-丑且-丙丞両並丨个中丱-串丶丸-丹主-丼丿乂-乃久之乍-乏乕-乙九-也乢乱乳乾亀亂亅-了予-二于云-互五-井亘-亙些-亜亞-亢交-亦亨享-亮亰亳亶人什-仂仄仆-仇今-介仍-仏仔-仙仝-仟仡代-以仭-仮仰仲件-价任-仼伀-企伃伉-伊伍-休会伜-伝伯-估伴伶伸-伺似-伽佃但-佇位-佑体何-佗余-佞佩佯-佰佳併-佶佻-佼使侃來侈侊-例侍侏侑-侒侔侖侘侚-供依侠-価侫侭-侯侵-侶便係-俄俉-俊俍-俎俐-俑俔俗-俘俚-俛保俟信俣-俥修-俯俳俵-俶俸俺俾-俿倅-倆倉個倍倏們-倒倔倖候-倚倞-借倡-倦倨-倭倶倹偀偂-偃偆-偉偏-偐偕-偖做停健偬偰偲側-偶偸偽傀傅傍傑傔傘-傚催-傭傲-債傷傾僂僅僉-僊働像僑僕-僖僘僚僞僣僥僧僭-僮僴-僵價僻儀-儂億儉儒儔-儖儘儚償儡優儲儷儺-儼儿-允元-兎児兒兔党兜兢兤-入全-兮共兵-典兼冀冂内-円冉-冊册-再冏-冓冕-冗写冝冠冢冤-冦冨-冬冰-冷冽-冾凄-准凉凋-凍凖凛-凝几-凡処-凧凩-凪凬-凭凰-凱凵-凶凸-出函-凾刀刃-刄分-刈刊-刋刎刑刔-刕列初判-別刧利-刪刮到刳制-刻剃-剄則削-前剏剔剖剛剞剣-剥剩-剪副-創剽剿劃劇-劉劍劑-劒劔力-劜功-加劣劦助-劭劯励労-劵効劼劾勀-勁勃勅勇勉勍勒動勗-務勛勝-勠勢-勤勦-勧勲-勳勵勸-勺勾-匂包-匈匍匏-匐匕-北匙-匚匝匠-匡匣-匤匪匯匱匳匸-医匿-十千卅-半卍卑-協南-単博卜卞占卦卩卮-卵卷-卸卻卿厂厄厓厖厘厚原-厠厥-厦厨-厩厭-厮厰厲-厳厶去参-參又-収叔取-受叙叛叝叟叡-句叨-右叶-司叺吁吃-各合-向君吝吟-吠否吩含-吮吶吸-吹吻-吾呀呂呆呈-告呎呑呟周呪呰-呱味呵-呷呻-命咀咄咆咊-和咎-咐咒咜咢咤-咥咨-咩咫-咬咯咲-咳咸咼-咾哀-哂哄哇-哉哘員-哢哥-哦哨-哩哭-哮哲哺哽哿唄唆-唇唏-唐唔唖售-唯唱唳唸-唹唾啀啄-商啌問啓啖-啗啜-啝啣啻-啼啾喀喃-善喆-喇喉-喋喘-喚喜-喟喧-喬單喰営嗄-嗅嗇嗔嗚嗜嗟嗣-嗤嗷嗹嗽-嗾嘆嘉嘔嘖-嘘嘛嘩嘯嘱-嘲嘴嘶嘸噂噌噎噐噛噤器噪-噬噴噸噺嚀嚆-嚇嚊嚏嚔嚠嚢嚥嚮嚴嚶嚼囀-囃囈囎囑囓囗-囘囚-四回因団囮困囲-図囹-固国囿-圀圃-圄圈-圉國圍圏園-圓圖團圜土圦-在圭地圷-圸圻址坂均坊坎-坑坙坡坤-坦坩-坪坿垂垈-垉型垓垠垢-垤垪垬垰垳埀埃埆-埈埋城埒-埔埖埜域-埠埣埴執培-基埼堀堂堅-堆堊-堋堕堙堝堡堤堪堯-報場-堵堺堽塀-塁塊-塋塑-塒塔塗-塚塞塢塩填塰塲塵塹塾境墅墓増墜增-墟墨墫墮墲-墳墸-墻墾壁壅壇壊壌壑壓壕壗-壙壜壞-壟壤-壥士-壬壮-売壷壹-壽夂変-夋夏-夐夕-外夘-夜夢夥大天-央失-夲夷-夸夾奄奇-奉奎-契奓-奕套-奘奚-奛奝奠奢-奣奥奧-奪奬奮女-奴奸好妁-妄妊妍妓妖妙妛妝妣-妥妨妬妲妹-妻妾姆姉始姐-姑姓-委姙-姚姜姥-姦姨姪-姫姶姻姿威娃娉娑娘娚娜娟-娠娥娩娯娵-娶娼婀-婁婆婉婚婢婦婪婬婿媒媚-媛媼-媾嫁-嫂嫉嫋-嫌嫐嫖-嫗嫡嫣嫦嫩嫺-嫻嬉嬋-嬌嬖嬢嬪嬬嬰嬲嬶嬾孀孃孅子-孑孔-存孚-孝孟季-学孩孫孰-孱孳孵學孺宀它宅宇-安宋-宍宏宕宗-宝実客-宦宮宰害-家宸-容宿-寀寂-寇寉富寐寒-寔寘寛寝-察寡-寢寤-審寫-寬寮寰寳寵-寶寸寺対-寿封-専射-尋對-小少尓尖尚尞尠尢尤尨尭就尸-屁居-屆屈届-屋屍-屑屓展属屠-屡層-履屬屮-屯山屶屹岌岐-岑岔岡岦岨-岩岫-岬岱岳岶-岸岺-岼岾峅峇峙峠-峡峨-峪峭峯-峰峵-島峺-峻峽崇崋崎崑崔-崛崟崢崧崩嵂嵋-嵌嵎嵐嵒-嵓嵜嵩嵬-嵭嵯嵳嵶嶂嶄嶇嶋-嶌嶐嶝嶢嶬嶮嶷-嶺嶼-嶽巉巌-巍巐巒-巓巖巛川-州巡巣工-巨巫差己-巵巷巻巽-巾市-布帆帋-希帑帖帙-帛帝帥師席帯-帰帳帶-常帽幀幃-幅幇幌幎幔-幕幗幟幡-幤干-并幸-广庁広-庄庇床序底-店庚府庠度-座庫庭庵-庸廁-廃廈-廊廏-廐廓廖廚-廛廝廟-廣廨-廩廬廰-廱廳-廴延-廸建-廼廾-廿弁弃-弄弉-弍式-弑弓-弘弛弟弡弥-弧弩弭弯弱弴-張強-弸弼弾彁彅彈彊彌彎彑当彖-彗彙彜-彝彡-形彦-彧彩-彭彰-影彳彷役彼彿-待徇-很徊-後徐-従得-徙從徠-御徨-循徭-微徳-徴德徹徼-徽心必忌-忍忖-忙応-忞忠忤快忰-忱念忸忻忽忿怎-怐怒怕-怖怙怛-思怠-怡急-怫怯怱怺恁-恃恆恊-恋恍恐恒恕恙-恚恝恟-恠恢-恥恨-恭息-恰恵恷悁悃-悅悉-悍悒悔悖-悗悚-悛悟-悠患悦-悧悩-悪悲-悶悸悼-悽情-惇惑惓惕惘惚惜惞-惡惣惧-惨惰-惴惶-惷惹-惻愀-愁愃愆愈-愉愍-意愑愕愚-愛感-愡愧-愨愬愰愴愷愼-愿慂慄慇-慈慊-慎慓慕慘-慚慝慟慢-慣慥慧-慨慫慮-慱慳-慷慾憂憇憊憎憐-憑憔憖憘-憚憤憧憩憫-憬憮憲憶憺憾懃懆-懍懐懣懦懲懴懶-懸懺懼-戀戈-戊戌-戎成-戔或戚-戛戝-戟戡戦截戮-戰戲-戴戸戻房-扁扇-扉手才-扎打払托扛扞扠扣扨扮扱扶批扼找-技抂-抄抉-把抑-折抛-抜択抦披-抬抱抵抹抻-抽拂担-拊拌-拍拏-拔拗-拙招-拝拠-拡括-拯拱拳拵-拷拾-拿持-挂指-按挌挑挙挟挧-挨挫振挺挽-挿捉捌-捍捏-捐捕捗捜捧-捩捫据捲捶-捷捺-捻掀掃授-掉掌掎-掏排掖掘掛掟-掣接控-掬掲掴-掵掻掾揀揃-揄揆揉描-提插揖揚-換握揣揩揮援-揶揺搆損搏搓搖-搗搜搦搨搬-搭搴搶携搾摂摎摘摠摧摩摯摶摸摺撃撈撒-撓撕撚撝-撞撤-撥撩撫播-撮撰撲撹撻-撼擁-擂擅擇操-擎擒擔擘據擠-擣擦-擧擬擯擱-擲擴擶擺擽-擾攀攅攘攜-攝攣-攤攪-攬支攴-改攻放-政故效敍-敏救敕-教敝-敞敢-散敦敬数敲整-敵敷-數斂-斃文-斉斌斎斐-斑斗料斛-斜斟斡斤-斥斧斫-断斯-新斷方於-施旁旃-旆旋-旌族旒旗旙旛无-既日-早旬-旭旱旺-旻昀昂-昃昆-昇昉-昊昌明-昏易-昕昜昞-映昤-春昧-昨昭-是昱昴-昶昻-昼昿晁-晄晉晋晏晒晗晙晝-晟晢晤-晩普-晰晳-晴晶智暁暃-暄暇-暉暎暑暖-暙暝暠暢暦暫暮暲暴暸-暹暼暾-暿曁曄曇曉曖曙-曚曜-曝曠曦曩曰曲-曵曷-最會月-有朋服-朏朔-朗望朝-期朦-木未-朮朱朴朶-朸机朽朿杁杆杉李-村杓杖杙杜杞-杦杪杭杯-杳杵杷杼松-板枅枇枉枋-枌析枕林枚果-枝枠-枢枦枩枯枳-枴架-枹枻柀-柁柄柆柊柎-柑染-柔柘柚柝-柞柢柤柧柩柬柮-柯柱柳-柵査柾-柿栁-栄栓栖-栗栞校-栢栩-栫栲栴核-根格-栽桀-桄框案桍-桎桐-桔桙桜-桝桟档桧桴桶-桷桾-桿梁梃梅梍梏梓-梔梗梛條梟-梠梢梦-梨梭梯-梱梳梵-梶梹-梺梼棄棆棈-棋棍棏棒棔-棕棗-棘棚棟-棡棣棧森-棯棲棹-棺椀-椁椄-椅椈椋-椏椒椙-検椡-椣椥-椦椨椪椰椴椶椹椽椿楊楓-楕楙-楚楜-楞楠-楢楨楪-楫業-楯楳-極楷-楹楼-楾榁-概榊榎榑榔-榕榘榛-榜榠榧榮榱-榲榴榻榾-榿槁槃槇槊-槎槐槓様-槙槝-槞槢槧-槨槫槭槲槹槻槽槿樂樅樊-樌樒-樔樗標樛樞-樟模-樣権-樫樮樰樵-樶樸-樺樽橄橆-橈橋橘-橙機橡-橢橦橫橲-橳橸橾-檀檄檍-檎檐檗檜檠檢-檣檪檬檮檳檸檻櫁-櫃櫑櫓櫚-櫛櫞-櫟櫢櫤櫨櫪櫺-櫻欄-欅權欒欖欝欟-次欣欧欲欷-欺欽-款歃歇歉歌歎歐歓-歔歙歛歟歡-此武歩-歪歯歳-歴歸-歹死歿-殀殃-殄殆殉-残殍殕-殖殘殞殤殪-殫殯殱-段殷殺-殼殿-毀毅-毆毋母-毎毒-比毖毘毛毟毫-毬毯毳氈氏民氓-气気氛氣-氤水氷-永氾-求汎汐汕汗汚汜-池汢汨汪汯-汰汲-汳決汽-汾沁-沃沆沈沌-沍沐沒-沓沖沙-沛没-沢沫沮沱河沸-沿況泄-泅泉-泊泌泓法泗泙-泛泝泡-泣泥注泪泯-泱泳洄洋-洌洒洗洙洛洞-洟津洩-洫洲-洳洵-洶洸活洽-派流浄-浅浙-浚浜浣-浤浦浩-浪浬浮-浯浴海-浹涅涇-消涌涎涓涕-涖涙涛-涜涬涯液涵涸涼淀淅-淇淋-淌淏淑-淒淕淘-淙淞淡淤淦淨淪-淬淮深-淳淵混-淼清渇-渋渓渕渙-減渝渟-渡渣-渧温渫-港游-渺渼渾湃湊湍-湎湖湘湛-湜湟湧湫湮-湯湲湶湾-満溂溌溏-源準溘溜-溝溟溢溥溪溯溲溶-溷溺溽溿滂滄-滅滉滋-滌滑滓-滕滝-滞滬滯滲滴滷-滸滾-滿漁-漂漆漉漏漑漓-漕漠漢-漣漫-漬漱-漲漸漾-漿潁潅潔潘潛-潜潟潤潦潭-潰潴潸潺潼澀-澂澄澆澈澎澑澗澡澣-澤澪澱澳澵澹激-濃濆濔-濕濘濛濟-濡濤濫-濬濮-濯濱濳濵-濶濺濾瀁瀅瀇瀉瀋瀏瀑瀕瀘瀚-瀛瀝-瀟瀦-瀨瀬瀰瀲瀾灌灑灘灣火灯-灰灸灼-災炅炉-炊炎炒炙炫-炯炳炸-炻烈烋烏烙烝烟烱烹烽焄焉焏焔焙-焚焜無焦然焼煆-煇煉煌煎煕-煖煙煜煢煤-照煩煬煮煽熄熈熊熏熔-熕熙熟熨熬熱熹熾燁燃燈-燉燎燐燒燔-燕燗營-燠燥-燧燬-燮燵燹燻-燼燾-燿爆爍爐爛爨爪爬-爭爰爲爵-父爺-牀牆-版牋-牌牒牘-牙牛牝牟牡-牢牧物牲牴特牽-牾犀-犂犇犒犖犠犢犧犬犯犱-犲状犹犾狂-狄狆狎狐狒狗狙狛狠-狢狩独-狭狷-狹狼-狽猊猖-猗猛-猝猟猤-猥猩-猫献-猯猴猶-猷猾-猿獄-獅獎-獏獗獣獨獪獰獲獵獷-獸獺-獻玄率玉王玖玩玲-玳玻玽珀珂珈-珊珍-珎珒珖珞珠珣珥珪班-珮珱珵珸現球琅-琇琉琢琥-琦琩-琪琮琲-琶琺琿瑁瑕瑙-瑜瑞-瑠瑢-瑤瑩-瑪瑯-瑰瑳瑶瑾璃璉璋璞-璟璢璧環璽瓊瓏瓔瓜瓠瓢-瓣瓦-瓧瓩瓮瓰-瓲瓶-瓸甁甃-甅甌-甎甑甓甕甘甚甜甞-生産甥-甦用甫-甬甯-申男-甸町-甼畄畆畉-畍畏畑畔留-畝畠畢畤-畧畩-畫畭畯-異畳-畴當-畸畿疂疆-疇疉-疋疎-疏疑疔疚疝疣疥疫疱-疳疵疸-疹疼-疾痂-痃病症痊痍痒痔-痕痘-痙痛痞痢-痣痩痰痲-痴痺痼痾-痿瘁瘉瘋瘍瘟-瘢瘤瘧瘰瘴瘻療癆-癈癌癒癖癘癜癡-癢癧-癪癬癰癲癶癸発-百皀皂-的皆-皈皋皎皐皓皖皙-皜皞皦皮皰皴皷-皺皿盂-盃盆盈益盍盒盖-盗盛-盜盞-盟盡監-盥盧盪目盲直相盻盾省眄眇-眉看-県眛眞-眠眤-眦眩眷-眸眺眼着睆-睇睚-睛睡督睥-睦睨睫睹睾-睿瞋瞎瞑瞞瞠瞥瞬-瞭瞰瞳瞶瞹瞻-瞽瞿矇矍矗矚-矜矢-矣知矧矩短-矯石矼砂砌砒研-砕砠-砡砥-砧砲破砺砿硅硎硝硤硫-硬硯硲硴硺硼碁碆-碇碌-碎碑碓碕碗碚碣碧碩-碪碯碵確碼碾磁磅-磆磊-磋磐-磑磔磚磧-磨磬磯磴磽礁礇礎礑-礒礙礦礪-礬礰示礼社祀-祁祇-祉祐祓祕-祗祚祝-祠祢祥票祭祷祺祿-禁禄-禅禊禍-福禔禛禝禦-禧禪禮禰禳禹-禺禽-私秉秋科-秒秕秘租秡秣-秤秦-秧秩秬称移稀稈程稍-税稔稗-稚稜稟-稠種稱-稲稷稻-穀穂-穃穆穉積-穐穗穡-穣穩穫穰穴究穹-空穽穿突窃-窄窈窒-窓窕-窘窟窩-窪窮-窰窶窺窿竃-竅竇-竈竊-立竍竏竑-竓竕站-竚竜-竝竟-竣童-竧竪-竫竭端-竰競竸-竺竿笂笄笆笈笊-笋笏笑笘-笙笛笞笠笥-符笨第笳笵-笶笹筅-筆筈-等筋-筍筏-筒答策筝筥筧筬筮筰-筱筴-筵筺箆-箇箋箍箏箒箔-箕算-箚箜-箟管箪箭箱箴箸節-篁範篆-篇築篋-篌篏篝篠篤-篦篩篭篳篶-篷簀簇簍簑-簔簗簟簡簣簧簪-簫簷-簸簽-籀籃籌-籍籏-籐籔籖籘籟-籠籤-籥籬米籵籾粁-粃粉粋粍粐粒粕粗-粘粛粟粡-粢粤-粥粧-粨粫粭-粮粱-粳粹粽-精糀糂糅糊糎糒糖糘糜糞-糠糢糧糯糲糴糶糸糺-系糾紀紂約-紆紊-紋納紐純-紕紗-紜素-索紫-紬紮-細紲-紳紵紹-紺紿終-絆絈絋-経絎-結絖絛-絜絞絡-絣給絨絮統-絳絵-絶絹絽綉綏經継-綜綟-綠綢-綣綫-網綴-綵綷-綸綺-綻綽-綿緇緊-緋総緑-緒緕-緖緘線緜-緞締-緡緤編-緩緬緯緲練緻縁縄-縅縉-縋縒縛縞-縟縡-縣縦縫縮縱-縲縵縷縹-縻總-績繁繃繆繊-繋繍繒織-繖繙-繚繝-繞繦-繧繩-繪繭繰繹繻-繽繿纂-纃纈-纊續纎-纐纒-纔纖纛-纜缶缸缺罅罇罌-罎罐-网罔-罕罘罟-罠罧-罫置罰署罵罷-罹羂-羃羅-羈羊羌美羔羚羝-羞羡羣-群羨-義羮-羯羲羶羸-羹羽翁翅-翆翊翌習翔-翕翠-翡翦翩翫翰翳翹翻-翼耀-老考-耆耋-而耐耒耕耗-耙耜耡耨耳耶耻耽耿聆聊聒聖聘聚聞-聟聡-聢聨聯-聰聲-聴聶-職聹聽-聿肄-肇肉肋-肌肓肖肘肚-肛肝股-肢肥肩-肪肬-肭肯肱-育肴肺胃-胄胆背胎胖胙-胛胝-胞胡胤-胥胯胱胴胸胼-能脂脅-脊脚-脛脣脩脯脱脳脹脾腆腋腎腐-腑腓-腕腟腥-腦腫腮腰-腱腴腸-腺腿-膀膂-膃膈膊膏膓膕膚膜-膝膠膣-膤膨-膩膰膳膵膸膺膽-臀臂臆臈-臉臍臑臓臘-臚臟-臠臣臥臧-臨自臭至-致臺-臼臾舁-舂舅與-舊舌-舎舐舒舖-舘舛-舜舞-舟舩-般舮舳舵-船艀艇艘-艚艝艟艢艤艦艨艪-艫艮-良艱-色艶-艸艾芋芍芒芙芝芟芥-芦芫-芭芯花芳芸-芹芻芽苅苑-苔苗苙苛-苜苞-苟苡苣若-苧苫英苳-苴苹-苻茁-茆茉茎茖-茘茜茣茨茫茯茱-茲茴-茶茸-茹荀荅草-荊荏-荐荒荘荢荳荵荷荻-荼荿莅莇莉-莊莎莓莖莚莞-莠莢莨莪-莫莱莵莽菁菅菇菊菌菎菓菖菘菜菟-菠菩菫華-菲菴菶-菷菻菽萃-萄萇萋-萎萓萠萢萩-萪萬萱萵萸萼-落葆葈-葉葎著葛葡-董葦葩葫-葯葱葵葷葹-葺蒂蒄蒋蒐蒔蒙蒜蒟蒡蒭蒲蒴蒸-蒹蒻-蒼蒿蓁蓄蓆蓉-蓋蓍蓐-蓑蓖蓙-蓚蓜蓬蓮蓴蓼蓿-蔀蔆蔑蔓-蔕蔗-蔘蔚蔟蔡蔦蔬-蔭蔵蔽蕀-蕁蕃蕈-蕋蕎蕓蕕蕗-蕚蕣蕨-蕫蕭蕷蕾薀薄薇-薈薊薐-薑薔薗薙薛-薜薤薦薨-薬薮-薰薹-薺藁藉藍藏-藐藕藜-藝藤-藥藩-藪藷藹-藻藾蘂蘆-蘇蘊-蘋蘓蘖-蘗蘚蘢蘭蘯-蘰蘿虍-虎虐虔-處虚虜虞-號虧虫虱虹虻蚊-蚌蚓蚕蚣-蚤蚩-蚫蚯-蚰蚶蛄蛆-蛇蛉蛋蛍-蛎蛔蛙蛛蛞-蛟蛤蛩蛬-蛯蛸-蛹蛻蛾蜀蜂-蜃蜆蜈-蜊蜍蜑-蜒蜘蜚蜜蜥蜩蜴蜷蜻蜿蝉蝋-蝌蝎蝓蝕蝗蝙蝟-蝠蝣蝦蝨蝪蝮蝴蝶蝸蝿螂融螟螢螫螯螳螺-螻螽蟀蟄蟆-蟇蟋蟐蟒蟠蟯蟲蟶-蟷蟹蟻蟾蠅蠇蠍-蠏蠑蠕-蠖蠡-蠣蠧蠱蠶蠹蠻血衂衄衆行-衍衒-術街衙衛衝-衞衡-衣表衫衰衲衵衷衽-衿袁-袂袈袋袍袒袖-袗袙袞袢袤被袮袰-袱袴-袵袷袿裁-装裏裔-裕裘-裙補-裝裟裡裨裲-裵裸-裹裼-裾褂褄複褊褌褐褒-褓褜-褞褥褪-褫褶褸褻襁襃-襄襌-襍襖襞-襠襤襦襪襭襯襲襴襷襾-西要覃覆-覈覊-見規覓視-覘覚覡覦-覧覩-親覬覯覲-観覺覽覿-觀角觚觜-觝解触-觧觴觸言訂-訃計訊訌討訐訒-訓訖-記訛訝訟訣訥訪設許訳-訴訶-訷診-証詁詆詈詐-詒詔-評詛詞詠詢-詣試詩詫-詮詰-詳詹詼誂誄-誅誇誉誌-認誑誓誕誘誚語誠-誡誣-誨説-読誰課誹誼誾-調諂諄談請-諍諏諒論諚-諜諞-諢諤諦-諧諫諭-諮諱諳諶-諸諺諾謀-謂謄謇謌謎謐謔謖-謗謙-講謝謠-謡謦謨謫-謬謳謹謾譁證譌譎-譏譓譖識譚-譜譟警譫-譬譯-譲譴護譽譿-讀讃變讌讎讐讒-讓讖讙-讚谷谺谿豁豆豈豊豌豎豐豕豚象-豢豪-豬豸-豺豼貂貅貉-貊貌-貎貔貘貝-貞負-貢貧-貰貲-貴貶-貸費-貽貿-賄資-賈賊賍-賎賑賓賚-賜賞賠賢-賤賦質賭賰賴賺-賽贄-贅贇-贈贊-贋贍贏-贐贒-贔贖赤赦-赧赫赭走-赱赳-赴赶-起趁超越趙趣趨足趺趾跂跋-跌跏跖跚-跛距跟跡跣跨跪-跫路跳践跼跿踈-踊踏-踐踝-踟踪踰踴-踵蹂蹄蹇-蹊蹌蹐蹕蹙蹟-蹠蹣-蹤蹲蹴蹶蹼躁躄-躅躇躊-躋躍躑躓-躔躙躡躪-躬躯-躱躾軅-軆軈車-軍軏軒軛軟転-軣軫軸軻-軾較輅載-輊輌輒-輕輙輛-輝輟輦輩-輪輯輳輸-輹輻輾-輿轂轄-轆轉轌-轎轗轜轟轡-轤辛-辜辞-辟辣辧-辨辭-農辷辺-込辿迂迄-迅迎近返迚迢迥-迦迩-迫迭迯-述迴迷-迺追退-送逃逅-逆逋逍-逑逓-逗這-通逝-連逧逮週-進逵-逶逸-逹逼逾遁-遂遅遇遉-運遍-遖遘-遙遜遞遠-遡遣遥遧-適遭-遯遲遵-選遺遼-遽避-還邇邉-邊邏邑那邦邨邪邯邱邵邸郁郊郎郛郞郡-郢郤部郭郵郷都鄂鄒鄕鄙鄧鄭鄰鄲酉-酎酒酔酖酘酢-酣酥酩-酪酬酲-酳酵酷-酸醂醇醉醋醍醐醒醗醜醢醤醪-醫醯醴-醵醸醺釀-釁釆-釉釋-金釖-釘釚-釟釡釣-釧釭-釮釵-釶釼釿鈆鈊鈍-鈎鈐-鈑鈔-鈕鈞鈩鈬鈴鈷鈹-鈺鈼鈿-鉀鉄-鉅鉈-鉉鉋鉎鉐-鉑鉗鉙-鉛鉞鉢鉤鉦-鉧鉱鉷-鉸鉾銀銃銅銈銑銓銕-銖銘銚-銜銧銭銷銹鋏-鋐鋒-鋓鋕鋗鋙鋠鋤鋧鋩-鋪鋭鋲-鋳鋸-鋼鋿錂錆錏-錐錘-錚錝-錞錠-錣錥-錦錨錫-錬錮-錯録錵錺-錻鍄鍈鍋鍍鍔鍖-鍗鍛-鍜鍠鍬鍮鍰鍵鍼鍾鎌鎔鎖-鎗鎚鎤鎧鎬-鎮鎰鎹鏃鏆鏈鏐-鏑鏖-鏘鏝-鏞鏡鏤-鏥鏨鏸鐃鐇鐐鐓-鐔鐘-鐚鐡鐫鐱鐵-鐶鐸鐺鑁鑄-鑅鑈鑑-鑓鑚-鑛鑞鑠鑢鑪鑰鑵鑷鑼-鑿钁長門閂-閃閇閉-開閏閑-閔閖閘-閙閠関-閥閧-閨閭閲閹閻-閼閾闃闇闊闌-闍闔-闖闘關闡-闢闥阜阡阨阪阮-阯防阻阿-陀陂附陋-降陏-限陛-陟院-陦陪陬陰陲-陳陵-陸険陽隅-隆隈隊-隋隍-随隔-隕隗-隙際-隝隠隣隧-隨險隯-隲隴隶-隹隻-隼雀-雁雄-雇雉雋-雎雑雕-雖雙雛-雜離-難雨雪-雫雰雲零-雷雹電需霄霆-霈霊霍-霏霑霓霖霙霜霞霤霧霪霰露-霳霸-霹霻霽-霾靂-靄靆靈-靉靍靏靑-青靕-靖静靜非靠-面靤靦靨-革靫靭靱靴靹-靺靼鞁鞄-鞆鞋鞍鞏-鞐鞘鞜鞠鞣鞦鞨鞫鞭鞳-鞴韃韆韈韋韓韜韭-韮韲-音韵-韶韻響頁-頃項-順須頌頏-頓頗-領頚頡頤頬-頭頴頷-頸頻-頽顆顋-顏顔-顕顗-願顛類顥顧顫顯-顱顳-顴風颪颯颱颶飃-飄飆飛-飜食飢飩飫飭-飯飲飴飼-飾餃餅餉-養餌餐餒-餔餘餝-餞餠-餡餤餧-館餬餮餽-餾饂饅饉饋-饌饐-饒饕饗首-香馞馥馨馬-馮馳-馴馼駁駄-駆駈駐-駒駕駘駛駝駟駢駭-駮駱-駲駸駻駿騁騅騎-騏騒-験騙騨騫騰騷騾驀驂-驃驅驍-驎驕驗驚-驛驟驢驤-驥驩-驫骨骭骰骸骼髀髄髏髑髓-體高-髙髜髞-髟髢-髣髦髪-髫髭-髯髱髴髷髻鬆鬘鬚鬟鬢-鬣鬥鬧-鬪鬮-鬯鬱-鬲鬻-鬼魁-魅魍-魏魑魔魘魚魯魲魴-魵鮃鮎-鮏鮑-鮓鮖-鮗鮟-鮠鮨鮪-鮫鮭-鮮鮱鮴鮹鮻鯀鯆鯉-鯊鯏鯑-鯒鯔鯖鯛鯡-鯤鯨鯰-鯲鯵鰀鰄鰆鰈-鰊鰌-鰍鰐鰒-鰕鰛鰡鰤-鰥鰭-鰰鰲鰹-鰻鰾鱆-鱈鱒鱗鱚鱠鱧鱶鱸鳥鳧鳩鳫-鳬鳰鳳-鳴鳶鴃鴆-鴉鴎鴒鴕鴛鴟鴣鴦鴨鴪-鴬鴻鴾-鴿鵁鵄鵆鵈鵐-鵑鵙鵜-鵞鵠-鵡鵤鵫-鵬鵯-鵰鵲鵺鶇鶉鶏鶚鶤鶩鶫鶯鶲鶴鶸鶺-鶻鷁-鷂鷄鷆鷏鷓鷙鷦鷭鷯鷲鷸-鷺鷽鸙-鸛鸞鹵鹸-鹹鹽鹿麁麈麋-麌麑-麓麕麗麝麟麥-麦麩-麪麭麸-麼麾-麿黄黌-黒黔默-黙黛-點黠黥黨黯黴黶-黷黹黻-黽鼇-鼈鼎鼓鼕鼠-鼡鼬鼻鼾齊-齋齎-齏齒齔齟-齣齦-齧齪齬齲齶-齷龍龕龜-龝龠朗隆﨎-鶴！-～￠-￥]*$/
```

Javascriptでも使えます。

## まとめ

Unicodeにしたから、文字コードの悩みから解放されるかというと、世の中そう甘くないことがお分かりかと思います。むしろ闇はより深くなります。移行は計画的に。