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>