X-0008 文字コードを変換する

Mozilla には、 UTF-8UTF-16 と他の文字コードを相互変換するインターフェースがあります。

const UConvID = '@mozilla.org/intl/scriptableunicodeconverter';
const UConvIF  = Components.interfaces.nsIScriptableUnicodeConverter;
const UConv = Components.classes[UConvID].getService(UConvIF);

使い方は以下の通り。

// UTF-16 から EUC-JP に変換する
UConv.charset = 'EUC-JP';
eucjp_str = UConv.ConvertFromUnicode(utf8_str);

// ISO-2022-JP から UTF-16 に変換する
UConv.charset = 'ISO-2022-JP';
utf8_str = UConv.ConvertToUnicode(iso2022jp_str);

UTF-8UTF-16 を介せば、例えば Shift_JIS から EUC-JP へ変換するということもできます。

検索エンジンなどに特定の文字コードで文字列を渡す場合、 URL に上のようにして変換した文字列を含めれば自動でエスケープされますが、 EUC-JP など他の文字コードに変換した場合、エスケープが正しく行われないようです。こういう場合、予め escape() でエスケープしてから文字列を渡すとうまくいきます。

loadURI('http://www.google.com/search?q='+escape(eucjp_str));

変換できる文字コードは内部で定義されているものに限られます。以下のようにすればどんなコードが使えるか調べられます。

<script type="application/x-javascript"><![CDATA[
  // 初期化
  var observerService = Components.classes['@mozilla.org/observer-service;1'].getService(Components.interfaces.nsIObserverService);
  observerService.notifyObservers(null, 'charsetmenu-selected', 'other');
]]></script>

<grid>
  <columns>
    <column/>
    <column/>
  </columns>
  <rows datasources="rdf:charset-menu"
    ref="NC:DecodersRoot">
    <template>
      <row uri="...">
        <text value="rdf:http://home.netscape.com/NC-rdf#Name"/>
        <text value="..."/>
      </row>
    </template>
  </rows>
</grid>