思案中

<!DOCTYPE html>
<title></title>
<meta charset="UTF-8">

<body>
  <h1>日本語文字列照合順番</h1>
  <p>
    ウィキペディア:
    <a href="http://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%96%87%E5%AD%97%E5%88%97%E7%85%A7%E5%90%88%E9%A0%86%E7%95%AA">
    日本語文字列照合順番
    </a> からの引用
  </p>
  
  <h2>仮名での並び替</h2>
  <p>通常辞書で扱われるよみがなに変更してから並び替える場合について記載する。</p>
  
  <ol>
    <li>
      一般に辞書などで並び替える時は、漢字などがある場合は該当の文字のに変更し、その後で並び替えを行う。
      辞書ではアルファベットで表記される文字列も全て読み仮名に変更する。

    <li>仮名に対し、次のように置き換える
      <ul>
        <li>「ぁ」「ゃ」「っ」などの小書き文字はその基底文字である「あ」「や」「つ」などに置き換える。
        <li>「が」「ば」などの濁点付き文字はその基底文字である「か」「は」などに置き換える。
        <li>「ぱ」「ぴ」などの半濁点付き文字はその基底文字である「は」「ひ」などに置き換える。
        <li>片仮名で表される文字は平仮名に変更する。
        <li>「ゝ」「ゞ」「ヽ」「ヾ」は「ゝ」に置き換える。
      </ul>

    <li>長音符「ー」を次のルールで置き換える。
      <ul>
        <li>前の文字が「あ」「か」「さ」「た」「な」「は」「ま」「や」「ら」「わ」→「あ」
        <li>前の文字が「い」「き」「し」「ち」「に」「ひ」「み」「り」「ゐ」→「い」
        <li>前の文字が「う」「く」「す」「つ」「ぬ」「ふ」「む」「ゆ」「る」→「う」
        <li>前の文字が「え」「け」「せ」「て」「ね」「へ」「め」「れ」「ゑ」→「え」
        <li>前の文字が「お」「こ」「そ」「と」「の」「ほ」「も」「よ」「ろ」「を」→「お」<sup id="cite_ref-0" class="reference"><a href="#cite_note-0">[1]</a></sup>
        <li>前の文字が「ん」→「ん」
        <li>前の文字が上記以外→置き換えない
      </ul>

    <li>繰り返し記号の「ゝ」を次のルールで置き換える。
      <ul>
        <li>直前の文字があり、上記変換後も繰り返し記号あるいは長音符以外の場合は直前の文字に置き換える。
        <li>直前の文字がない場合は置き換えない。
      </ul>

    <li>上記置き換えて出来た文字列に付いて、文字列の先頭より次の順序で比較して先にあるものが先になるように並び替える。
      <ul>
        <li>「あ」「い」「う」「え」「お」「か」「き」「く」「け」「こ」
            「さ」「し」「す」「せ」「そ」「た」「ち」「つ」「て」「と」
            「な」「に」「ぬ」「ね」「の」「は」「ひ」「ふ」「へ」「ほ」
            「ま」「み」「む」「め」「も」「や」「ゆ」「よ」「ら」「り」
            「る」「れ」「ろ」「わ」「ゐ」「ゑ」「を」「ん」「ゝ」「ー」
      </ul>

    <li>上記で文字列の並び替えを行った後、一致する順位となる文字列は、次のルールで並べる。
      <ol>
        <li>清音文字→濁点付き文字→半濁点付き文字
        <li>長音符→小書き文字→繰り返し記号→通常文字
        <li>平仮名→片仮名
      </ol>

  </ol>
  <p>
    読み仮名は一般に決まるものであるが、読みが別に示されていない場合は機械的に正しい読みを判断
    することは困難であることが多い。その場合は1つの漢字に対し1つの読みを定義しその読みの順序で
    並べる代表読み照合を用いるか、その漢字の代表読みの先頭文字だけで判断する簡易代表読み照合を用いる。
  </p>
<script>
(function () {
  var CHAR_ODORIJI = 'ゝゞヽヾ';
  var CHAR_JP_DAKUON          = 'がぎぐげござじずぜぞだぢづでどばびぶべぼガギグゲゴザジズゼゾダヂヅデドバビブベボ';
  var CHAR_JP_DAKUON_SEION    = 'かきくけこさしすせそたちつてとはひふへほカキクケコサシスセソタチツテトハヒフヘホ';
  var CHAR_JP_HANDAKUON       = 'ぱぴぷぺぽパピプペポ';
  var CHAR_JP_HANDAKUON_SEION = 'はひふへほハヒフヘホ';
  var CHAR_JP_SUTEGANA        = 'ぁぃぅぇぉ&#12437;&#12438;っゃゅょゎァィゥェォヵ&#12784;ヶ&#12785;&#12786;ッ&#12787;&#12788;&#12789;&#12790;&#12791;&#12792;&#12793;&#12794;ャュョ&#12795;&#12796;&#12797;&#12798;&#12799;ヮ'; //&#12791;&#12442; 除外
  var CHAR_JP_SUTEGANA_SEION  = 'あいうえおかけつやゆよわアイウエオカクケシスツトヌハヒフヘホムヤユヨラリルレロワ'; //プ除外

  // bit [
  //  19-12:あいうえお順, 11~8: 0=あ行,.., 4=お行, 5=ん, 6=(半)濁点, 7=繰り返し文字, 8=置換文字 9=-
  //   7:置換文字, 6:半濁音, 5:(半)濁音文字, 4:繰り返し記号,   3:捨て仮名, 2:長音, 1:半角文字, 0:カタカナ
  // ]
  // 順番: 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんゝー'
  // 順番: '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132'
  var KANA_MAPPING = {
                     '\u3041': 0x01008, '\u3042': 0x01000, '\u3043': 0x02108, '\u3044': 0x02100, '\u3045': 0x03208, '\u3046': 0x03200, '\u3047': 0x04308, //  ぁあぃいぅうぇ
    '\u3048': 0x04300, '\u3049': 0x05408, '\u304a': 0x05400, '\u304b': 0x06000, '\u304c': 0x06020, '\u304d': 0x07100, '\u304e': 0x07120, '\u304f': 0x08200, // えぉおかがきぎく
    '\u3050': 0x08220, '\u3051': 0x09300, '\u3052': 0x09320, '\u3053': 0x0a400, '\u3054': 0x0a420, '\u3055': 0x0b000, '\u3056': 0x0b020, '\u3057': 0x0c100, // ぐけげこごさざし
    '\u3058': 0x0c120, '\u3059': 0x0d200, '\u305a': 0x0d220, '\u305b': 0x0e300, '\u305c': 0x0e320, '\u305d': 0x0f400, '\u305e': 0x0f420, '\u305f': 0x10000, // じすずせぜそぞた
    '\u3060': 0x10020, '\u3061': 0x11100, '\u3062': 0x11120, '\u3063': 0x12208, '\u3064': 0x12200, '\u3065': 0x12220, '\u3066': 0x13300, '\u3067': 0x13320, // だちぢっつづてで
    '\u3068': 0x14400, '\u3069': 0x14420, '\u306a': 0x15000, '\u306b': 0x16100, '\u306c': 0x17200, '\u306d': 0x18300, '\u306e': 0x19400, '\u306f': 0x1a100, // とどなにぬねのは
    '\u3070': 0x1a020, '\u3071': 0x1a060, '\u3072': 0x1b100, '\u3073': 0x1b120, '\u3074': 0x1b260, '\u3075': 0x1c200, '\u3076': 0x1c220, '\u3077': 0x1c260, // ばぱひびぴふぶぷ
    '\u3078': 0x1d300, '\u3079': 0x1d320, '\u307a': 0x1d360, '\u307b': 0x1e400, '\u307c': 0x1e420, '\u307d': 0x1e460, '\u307e': 0x1f000, '\u307f': 0x20100, // へべぺほぼぽまみ
    '\u3080': 0x21200, '\u3081': 0x22300, '\u3082': 0x23400, '\u3083': 0x24008, '\u3084': 0x24000, '\u3085': 0x25208, '\u3086': 0x25200, '\u3087': 0x26408, // むめもゃやゅゆょ
    '\u3088': 0x26400, '\u3089': 0x27000, '\u308a': 0x28100, '\u308b': 0x29200, '\u308c': 0x2a300, '\u308d': 0x2b400, '\u308e': 0x2c008, '\u308f': 0x2c000, // よらりるれろゎわ
    '\u3090': 0x2d100, '\u3091': 0x2e300, '\u3092': 0x2f400, '\u3093': 0x30500, '\u3094': 0x03220, '\u3095': 0x06008, '\u3096': 0x09308,                    // ゐゑをん&#12436;&#12437;&#12438; 
    '\u3098': 0x00600, '\u3099': 0x00620, '\u309a': 0x00660, '\u309b': 0x00720, '\u309c': 0x00760, '\u309d': 0x31700, '\u309e': 0x31860,                    //   &#12442;   ゛ ゜ゝゞ&#12447;
                       '\u30a1': 0x01009, '\u30a2': 0x01001, '\u30a3': 0x02109, '\u30a4': 0x12101, '\u30a5': 0x03209, '\u30a6': 0x03201, '\u30a7': 0x04309, // &#12448;ァアィイゥウェ
    '\u30a8': 0x04301, '\u30a9': 0x05409, '\u30aa': 0x05401, '\u30ab': 0x06001, '\u30ac': 0x06021, '\u30ad': 0x07101, '\u30ae': 0x07121, '\u30af': 0x08201, // エォオカガキギク
    '\u30b0': 0x08221, '\u30b1': 0x09301, '\u30b2': 0x09321, '\u30b3': 0x0a401, '\u30b4': 0x0a421, '\u30b5': 0x0b001, '\u30b6': 0x0b021, '\u30b7': 0x0c101, // グケゲコゴサザシ
    '\u30b8': 0x0c121, '\u30b9': 0x0d201, '\u30ba': 0x0d221, '\u30bb': 0x0e301, '\u30bc': 0x0e321, '\u30bd': 0x0f401, '\u30be': 0x0f421, '\u30bf': 0x10001, // ジスズセゼソゾタ
    '\u30c0': 0x10021, '\u30c1': 0x11101, '\u30c2': 0x11121, '\u30c3': 0x12209, '\u30c4': 0x12201, '\u30c5': 0x12221, '\u30c6': 0x13301, '\u30c7': 0x13321, // ダチヂッツヅテデ
    '\u30c8': 0x14401, '\u30c9': 0x14421, '\u30ca': 0x15901, '\u30cb': 0x16101, '\u30cc': 0x17201, '\u30cd': 0x18301, '\u30ce': 0x19401, '\u30cf': 0x1a001, // トドナニヌネノハ
    '\u30d0': 0x1a021, '\u30d1': 0x1a061, '\u30d2': 0x1b101, '\u30d3': 0x1b121, '\u30d4': 0x1b161, '\u30d5': 0x1c201, '\u30d6': 0x1c221, '\u30d7': 0x1c261, // バパヒビピフブプ
    '\u30d0': 0x1d301, '\u30d9': 0x1d321, '\u30da': 0x1d361, '\u30db': 0x1e401, '\u30dc': 0x1e421, '\u30dd': 0x1e461, '\u30de': 0x1f001, '\u30df': 0x20101, // ヘベペホボポマミ
    '\u30e0': 0x21201, '\u30e1': 0x22301, '\u30e2': 0x23401, '\u30e3': 0x24009, '\u30e4': 0x24001, '\u30e5': 0x25209, '\u30e6': 0x25201, '\u30e7': 0x26409, // ムメモャヤュユョ
    '\u30e0': 0x24601, '\u30e9': 0x27001, '\u30ea': 0x28101, '\u30eb': 0x29201, '\u30ec': 0x2a301, '\u30ed': 0x2b401, '\u30ee': 0x2c009, '\u30ef': 0x2c001, // ヨラリルレロヮワ
    '\u30f0': 0x2d101, '\u30f1': 0x2e301, '\u30f2': 0x2f401, '\u30f3': 0x30501, '\u30f4': 0x03221, '\u30f5': 0x06009, '\u30f6': 0x09309, '\u30f7': 0x2c021, // ヰヱヲンヴヵヶ&#12535;
    '\u30f0': 0x2d121, '\u30f9': 0x2e321, '\u30fa': 0x2f421,                  '\u30fc': 0x32901, '\u30fd': 0x31711, '\u30fe': 0x31731, '\u30ff': 0x00800, // &#12536;&#12537;&#12538;・ーヽヾ&#12543;
    '\u31F0': 0x08209, '\u31F1': 0x0c109, '\u31F2': 0x0d209, '\u31F3': 0x14409, '\u31F4': 0x17209, '\u31F5': 0x1a009, '\u31F6': 0x1b109, '\u31F7': 0x1c209, // &#12784;&#12785;&#12786;&#12787;&#12788;&#12789;&#12790;&#12791;
    '\u31F8': 0x1d309, '\u31F9': 0x1e409, '\u31Fa': 0x21209, '\u31Fb': 0x27009, '\u31Fc': 0x28109, '\u31Fd': 0x29209, '\u31Fe': 0x2a309, '\u31Ff': 0x2b409, // &#12792;&#12793;&#12794;&#12795;&#12796;&#12797;&#12798;&#12799;
    '\u32d0': 0x01001, '\u32d1': 0x02101, '\u32d2': 0x03201, '\u32d3': 0x04301, '\u32d4': 0x05401, '\u32d5': 0x06001, '\u32d6': 0x07101, '\u32d7': 0x08201, // &#13008;&#13009;&#13010;&#13011;&#13012;&#13013;&#13014;&#13015; アイウエオカキク
    '\u32d8': 0x09301, '\u32d9': 0x0a401, '\u32da': 0x0b001, '\u32db': 0x0c101, '\u32dc': 0x0d201, '\u32dd': 0x0e301, '\u32de': 0x0f401, '\u32df': 0x10001, // &#13016;&#13017;&#13018;&#13019;&#13020;&#13021;&#13022;&#13023; ケコサシスセソタ
    '\u32e0': 0x11101, '\u32e1': 0x12201, '\u32e2': 0x13301, '\u32e3': 0x14401, '\u32e4': 0x15001, '\u32e5': 0x16101, '\u32e6': 0x17201, '\u32e7': 0x18301, // &#13024;&#13025;&#13026;&#13027;&#13028;&#13029;&#13030;&#13031; チツテトナニヌネ
    '\u32e8': 0x19401, '\u32e9': 0x1a001, '\u32ea': 0x1b101, '\u32eb': 0x1c201, '\u32ec': 0x1d301, '\u32ed': 0x1e401, '\u32ee': 0x1f001, '\u32ef': 0x20101, // &#13032;&#13033;&#13034;&#13035;&#13036;&#13037;&#13038;&#13039; ノハヒフヘホマミ
    '\u32f0': 0x21201, '\u32f1': 0x22301, '\u32f2': 0x23401, '\u32f3': 0x24001, '\u32f4': 0x25201, '\u32f5': 0x26401, '\u32f6': 0x27001, '\u32f7': 0x28101, // &#13040;&#13041;&#13042;&#13043;&#13044;&#13045;&#13046;&#13047; ムメモヤユヨラリ
    '\u32f8': 0x29201, '\u32f9': 0x2a301, '\u32fa': 0x2b401, '\u32fb': 0x2c001, '\u32fc': 0x2d101, '\u32fd': 0x2e301, '\u32fe': 0x2f401,                  // &#13048;&#13049;&#13050;&#13051;&#13052;&#13053;&#13054;&#13055; ルレロワヰヱヲ

                                                                                                          '\uff66': 0x2f403, '\uff67': 0x0100b, // ?。「」、・ヲァ 	     
    '\uff68': 0x0210b, '\uff69': 0x0320b, '\uff6a': 0x0430b, '\uff6b': 0x0540b, '\uff6c': 0x2400b, '\uff6d': 0x2520b, '\uff6e': 0x2640b, '\uff6f': 0x1220b, // ィゥェォャュョッ
    '\uff70': 0x32903, '\uff71': 0x01003, '\uff72': 0x02103, '\uff73': 0x03203, '\uff74': 0x04303, '\uff75': 0x05403, '\uff76': 0x06003, '\uff77': 0x07103, // ーアイウエオカキ
    '\uff78': 0x08203, '\uff79': 0x09303, '\uff7a': 0x0a403, '\uff7b': 0x0b003, '\uff7c': 0x0c103, '\uff7d': 0x0d203, '\uff7e': 0x0e303, '\uff7f': 0x0f403, // クケコサシスセソ
    '\uff80': 0x10003, '\uff81': 0x11103, '\uff82': 0x12203, '\uff83': 0x13303, '\uff84': 0x14403, '\uff85': 0x15003, '\uff86': 0x16103, '\uff87': 0x17203, // タチツテトナニヌ
    '\uff88': 0x18303, '\uff89': 0x19403, '\uff8a': 0x1a003, '\uff8b': 0x1b103, '\uff8c': 0x1c203, '\uff8d': 0x1d303, '\uff8e': 0x1e403, '\uff8f': 0x1f003, // ネノハヒフヘホマ
    '\uff90': 0x20103, '\uff91': 0x21203, '\uff92': 0x22303, '\uff93': 0x23403, '\uff94': 0x24003, '\uff95': 0x25203, '\uff96': 0x26403, '\uff97': 0x27003, // ミムメモヤユヨラ 
    '\uff98': 0x28103, '\uff99': 0x29203, '\uff9a': 0x2a303, '\uff9b': 0x2b403, '\uff9c': 0x2c003, '\uff9d': 0x30503, '\uff9e': 0x00621, '\uff9f': 0x00661  // リルレロワン゙゚
  };

// bit [
//   19-12:あいうえお順, 11~8: 0=あ行,.., 4=お行, 5=ん, 6=(半)濁点, 7=繰り返し文字, 8=置換文字 9=-
//   7:置換文字, 6:半濁音, 5:(半)濁音文字, 4:繰り返し記号,   3:捨て仮名, 2:長音, 1:半角文字, 0:カタカナ
// ]
// 順番: 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんゝー'
// 順番: '0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132'



  function parseJpKana (str) {
    var kana = [];
    var assessment = [];
    var idx = 0;
    var char;
    var value;
    var code;
    var attr;
    var rst;
    var len;
    var gyou;
    
    for (; char = str[idx++]; ) {
      rst = null;
      if ((value = KANA_MAPPING [char])) {
        code = value >>> 12;
        gyou = value >>> 8 & 0x0f;
        attr = value & 0xff;

        switch (true) {
        case (code === 0) : //(半)濁点
          attr &= 0x60;
          if (attr) {
            len = assessment.length - 1;
            if (0 < len)
              rst = assessment[len];
              assessment[len] = rst | attr; 
              continue;
          }
          break;
          
        case (code === 0x32) : // 長音(ー|&#8211;) "-" マイナス記号は無視する
          len = assessment.length;
          if (0 < len)
            rst = assessment[len - 1] | 0x04;
          break;
        
        
        case (code === 0x31) : // 踊り字(繰り返し文字 : 'ゝゞヽヾ') 
          len = assessment.length;
          if (0 < len) {
            // 前参照文字が何であれ、続く「ゝゞ」は平仮名として、「ヽヾ」はカタカナとして評価する
            // 「あ゛ヽ」 の踊り字は、カタカナの「ア」になる。
            // 「パゞ」の踊り字は、平仮名の「ぱ」になる。
            //  0xffbe のビットをマスクして、踊り字の持つ属性(0x31)を追加する。繰り返し文字のビット(0x10)を立てる。
            rst = (assessment[len - 1] & 0xffbe) | (attr & 0x31) | 0x10;
          }
          break;

        default :
          rst = value;
        }
      }
      
      assessment.push (rst || char);
    }
    
    return assessment;
  }

var test = 'あア|あーアー|ぁ|あゝ|あ゛|あ゜|ア|アー|ァ|ア゛ヽ|ア゜ヾ';

alert (parseJpKana (test).map (function (n) {
  return isNaN (n)
  ? n
  : 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをんゝー'.substring ((n >>> 12) - 1, (n >>> 12)) +
    '(' + n.toString (16)+ ')'
   

; }).join("\n"));
  
  function JpKanaString (str) {
    this.string = str;
    this.code = parseJpKana (str);
  }
  
  
  function create (str) {
    if (1 > arguments.length)
      throw new Error;
    
    return new JpKanaString (str);
  }
  
  //________________
  
  JpKanaString.create = create;
  this.JpKanaString = JpKanaString;
}) ();




function UniCodePartSorter (dic, direction) {
  var hash = { };
  direction = (! direction) ? -1: 1;
  
  return function (a, b) {
    var aStr = hash[a] || (hash[a] = new Str (a, dic));
    var bStr = hash[b] || (hash[b] = new Str (b, dic));
    var ac, bc;
    
    aStr.reset ();
    bStr.reset ();
    
    while (true) {
      ac = aStr.nextCharCode ();
      bc = bStr.nextCharCode ();

      if (ac < -1)
        return (bc < -1) ? 0: direction;
      if (null === bc)
        return (null === ac) ? 0: -direction;
      if (ac === bc)
        continue;

      return direction * (ac < bc);
    }
  };
}

</script>
<pre>
309B,゛,<compat>   &#12441;
309C,゜,<compat>   &#12442;
309F,&#12447;,<vertical> よ り
30FF,&#12543;,<vertical> コ ト
FF65,・,<narrow> ・
FF70,ー,<narrow> ー
FF9E,゙,<narrow> &#12441;
FF9F,゚,<narrow> &#12442;
1F200,&#7968;0,<square> ほ か
1F201,&#7968;1,<square> コ コ
1F202,&#7968;2,<square> サ
1F213,&#7969;3,<square> デ
</pre>