たちまちメモる

開発中に気になったことをメモしてます。

URL文字列に含まれている日本語(マルチバイト文字)だけエンコードする

ハイブリッドアプリ(※注釈1)のWeb部分を開発している中でiOSだけ
facebookの公式ページのようにURLの中にマルチバイト文字が含まれているものがそのままあると問題があって不都合だったのでメモ。



動作確認デモ
URL文字列に含まれている日本語(マルチバイト文字)だけエンコードする


問題はjavascriptでURL文字列に含まれているASCII文字以外だけを
狙い撃ちでエンコードしてやることで解決した。

/**
 * URLに含まれるマルチバイト文字列のみURLエンコードする
 * @param  string url 変換前のURL
 * @return string     変換後のURL
 */
function encodeURIMultibyteChar(url){
  //アスキーコード以外をURLエンコード
  url = url.replace(/([^\x00-\x7F]+)/ig, function(match, contents, offset, s){
    return encodeURIComponent(match);
  });
  return url;
}

正規表現はこれ

/([^\x00-\x7F]+)/ig

ASCII文字以外で連続している文字列にマッチさせている。



※注釈1 スマートフォンアプリだけど一部がWebサイトブラウザみたいになっている。

◆参考サイト
Webとネイティブの好いとこ取り? ハイブリッドアプリ開発のススメ
http://thinkit.co.jp/story/2012/12/10/3862

漢字、ひらがな、カナカナにマッチさせる | 正規表現の使用方法
http://so-zou.jp/software/tech/programming/tech/regular-expression/meta-character/variable-width-encoding.htm

String.prototype.replace() - JavaScript | MDN
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace