JavaScript で、 シフトJISのまま URLエンコードする関数(または
簡単な方法)はないでしょうか?

最近の JavaScript の escape でエンコードすると、日本語コードを
勝手に Unicode に変換してしまいます。

やはり、Unicode と シフトJISの対応表を持った関数を作らないと
いけないのでしょうか? みなさんはどうしていますか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

以前同じ質問をしたのですが、方法がないのか回答はありませんでした。


私が調べた範囲では、標準の関数では不可能のようです。
また、UnicodeとシフトJISの変換はかなり複雑で、Java Scriptにやらせるのは一苦労だと思うのですが・・・。
私は諦めて、Perl(CGI)にやらせるようにしました。

この回答への補足

質問から、1年以上、経ちましたが、
たまたま、「とほほのWWW入門」というサイトで、
一応の方法を発見しました。
同様のことで、苦労している方はそちらを参考にしてください。

上記サイトから、以下のようにたどると、サンプルプログラムが見られると思います。

トップ > アラカルト > escape()でシフトJISエンコードする

補足日時:2003/05/02 17:11
    • good
    • 0
この回答へのお礼

回答、ありがとうございました。

実は、kazu-kun さんの質問は、チェックしていたのですが、回答者がいないのは単にタイミングの問題ではないかと思い、再度、質問させていただきました。ダメモトで。

やはり、いい方法はないのですかねぇ。
もしかしたら、名案を持っている人がいるかもしれないので、しばらく締め切らずに置きます。

やはり、CGI側での対処が賢いのですかね。
ほんとに、MSはいらんことしますね。

お礼日時:2002/01/10 16:20

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q文字コードチェックについて

文字コードのチェックについて質問です。

検索した所、下記の質問で同じような質問がでていたので参考に作ってみたのですが
java.lang.ArrayIndexOutOfBoundsException
になってしまい動作しません。
charに変換するときに2byte使う条件が違っているのだと思うのですがよくわかりませんでした。
http://okwave.jp/qa1754723.html
↑参考にした質問

入力された文字に対象となる文字コードが含まれているかをUnicodeではなくてSJISのコードで調べたいのですがどうすればよいか教えてくれませんか?
うまく動作しなかったのは下記のコードです。
引数で与えられた文字列にSJISの8740~879c、ed40~effc、fa40~fc4b(機種依存文字と外字)
が含まれていたらエラーにするようなメソッドです。

---
private boolean checkChar(String target) {
byte charArray[] = charArray = target.getBytes("MS932");
for (int i = 0; i < charArray.length; i++) {
byte charByte = charArray[i];
char targetChar;
if (charByte >= 128) {
targetChar = (char) charByte;
} else {
targetChar = (char) (charByte * 0x100 + charArray[i + 1]);
i++;
}
if (0x8740 <= targetChar && targetChar <= 0x879c) {
// エラー処理
return false;
}
if (0xed40 <= targetChar && targetChar <= 0xeffc) {
// エラー処理
return false;
}
if(0xfa40 <= targetChar && targetChar <= 0xec4b) {
// エラー処理
return false;
}
}
return true;
}
---

文字コードのチェックについて質問です。

検索した所、下記の質問で同じような質問がでていたので参考に作ってみたのですが
java.lang.ArrayIndexOutOfBoundsException
になってしまい動作しません。
charに変換するときに2byte使う条件が違っているのだと思うのですがよくわかりませんでした。
http://okwave.jp/qa1754723.html
↑参考にした質問

入力された文字に対象となる文字コードが含まれているかをUnicodeではなくてSJISのコードで調べたいのですがどうすればよいか教えてくれませんか?
うま...続きを読む

Aベストアンサー

Java はあまり使ってないので間違っているかもしれませんが…

Java の byte は符号付で文字コード範囲を比較する際に扱いにくいので,

> byte charByte = charArray[i];

とするよりも,

int charByte = charArray[i] & 0xFF;

とする方がいいと思います.


// charByte が SJIS 2バイト文字の第1バイトのときそのときに限り真を返す.
private static boolean isLeadByte(int charByte)
{
  return ((0x81 <= charByte) && (charByte <= 0x9F)) ||
         ((0xE0 <= charByte) && (charByte <= 0xFC));
}

// charByte が SJIS 2バイト文字の第2バイトのときそのときに限り真を返す.
private static boolean isTrailByte(int charByte)
{
  return (0x40 <= charByte) && (charByte <= 0xFC) && (charByte != 0x7F);
}

private boolean checkChar(String target) {
  byte charArray[] = charArray = target.getBytes("MS932");
  for(int i = 0; i < charArray.length; i++) {
    int charByte = charArray[i] & 0xFF;
    int charByte2, targetChar;

    if(isLeadByte(charByte)) {
      // charByte が2バイト文字の第1バイトの場合
      if(++i >= charArray.length) {
        // 第2バイトが存在しない場合:エラー
        return false;
      }
      charByte2 = charArray[i] & 0xFF;
      if(!isTrailByte(charByte2)) {
        // 第2バイトが不正:エラー
        return false;
      }
      targetChar = (charByte << 8) | charByte2;

      if((0x8740 <= targetChar) && (targetChar <= 0x879E)) {
        // 13区 (NEC特殊文字の場合):エラー
        return false;
      }
      if((0xED40 <= targetChar) && (targetChar <= 0xEFFC)) {
        // 89~92区 (NEC選定IBM拡張文字) の場合:エラー
        return false;
      }
      if((0xFA40 <= targetChar) && ((targetChar <= 0xEC4B)) {
        // 115~119区 (IBM拡張文字) の場合:エラー
        return false;
      }
    }
  }
  return true;
}

でどうでしょうか? (コンパイルは通してません.)


あと,

> SJISの8740~879c、ed40~effc、fa40~fc4b(機種依存文字と外字)

そのコード範囲は機種依存文字ばかりで外字は含まれていません.
ユーザ定義外字は95~114区 (0xF040~0xF9FC) です.

Mac ユーザも対象に含めるならば,9~14区 (0x8540~0x889E) も
機種依存文字です.

余計なお世話かもしれませんが,上記の範囲に限らず,シフト JIS の
コード範囲のうち JIS X 0208 で未定義の部分はすべて禁止にした方が
いいんじゃないでしょうか?

・JIS X 0208 で未定義の範囲 (主なものだけ)
9~15区 (0x8540 ~ 0x889E)
85~120区 (0xEB40 ~ 0xFCFC)


Shift_JIS
http://ja.wikipedia.org/wiki/Shift_JIS

Microsoftコードページ932 (Windows版シフトJIS)
http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932

MacJapanese (Mac版シフトJIS)
http://ja.wikipedia.org/wiki/MacJapanese

Java はあまり使ってないので間違っているかもしれませんが…

Java の byte は符号付で文字コード範囲を比較する際に扱いにくいので,

> byte charByte = charArray[i];

とするよりも,

int charByte = charArray[i] & 0xFF;

とする方がいいと思います.


// charByte が SJIS 2バイト文字の第1バイトのときそのときに限り真を返す.
private static boolean isLeadByte(int charByte)
{
  return ((0x81 <= charByte) && (charByte <= 0x9F)) ||
         ((0xE0 <= charByte...続きを読む

QJavaのStringクラスに「外字」という概念はある?

 今、客先のデータをJavaで処理しようとしているのですが、そのデータ(Shift-JISの文字列データ)には、今まで使われてきた「外字」が含まれています。
 私の知っている範囲では、Shift-JISの文字列でも、Javaで読み込んだら内部的にUnicodeに変換されるのではないかと思っているのですが(←間違っているかもしれません)、そのUnicode変換の際に外字の部分はどうなってしまうのでしょうか。また、Unicodeに変換された文字列を、出力の際にまたShift-JISに戻すことになると思うのですが、そのときにはちゃんと以前の外字コードに戻ってくれることが保証されているのでしょうか。
 JavaのリファレンスでStringクラスのページで「外字」という文字列で検索してみたのですが、まったくひっかからなかったので不安になっています。
 よろしくお願い致します。

Aベストアンサー

 #1です。

 似たような質問があがっているところを見つけました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=22555

 ということで、これを参考に実験です。

 UTF-16の外字の領域を一文字ずつShift-JISに変換して、また、UTF-16に戻して、ちゃんともとにもどるか、やってみました。

public class Gaiji {
  public static void main(String[] args) throws Exception {
    final String charSet = "Shift-JIS";
    
    boolean allEqual = true;
    
    for (char c = 0xE000; c <= 0xF8FF; c++) {
      System.out.print(Integer.toHexString((int)c) + "→");
      char[] carray = {c};
      String source = new String(carray);
      byte[] sjis = source.getBytes(charSet);
      
      for (byte b : sjis)
        System.out.print(Integer.toHexString(((int)b & 0xFF)));
      
      System.out.print("→");
      
      String result = new String(sjis, charSet);
      System.out.print(Integer.toHexString((int)result.charAt(0)) + " : ");
      
      boolean equal = source.equals(result);
      System.out.println(equal);
      
      allEqual = (allEqual && equal);
    }
    System.out.println();
    System.out.println("すべて一致 : " + Boolean.toString(allEqual));
  }
}
(コンパイルするときは全角スペースを半角スペースに変換してからにしてください)

 ところがぜんぜんダメ。
 元に戻りません。
 ということで、Windowsの本来の文字コードWindows-31Jでやってみました。

final String charSet = "Windows-31J"; ←変更

 どうやらうまく行っているのですが、途中までは順調に変換され、元に戻るものの、途中からだめになりました。
 どうやら、UTF-16 : E757 Shift-JIS : F9FC の次からだめになっています。

 外字エディタで見てみるとちょうどF9FCまでが、Shift-JISの外字領域のようです。
 つまり、UTF-16のほうがShift-JISより、外字領域が大きいみたいです。
 当然そこから先は、Shift-JISには、変換不能ということになります。

 というわけで、

1.Windowsでは、通常ならCharSetがShift-JISでも大体大丈夫だけど、外字の変換をするときにはちゃんとWindows-31Jを指定しないとダメ。

2.UTF-16 : E000~E757 Shift-JIS : F040~F9FC の範囲なら変換可能。
 UTF-16 : E758~F8FF の範囲はShift-JISに相手がいないので無理。

 ってことで、Shift-JISで外字が設定されているのなら、大丈夫ってことになるんじゃないでしょうか。

参考URL:http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=22555

 #1です。

 似たような質問があがっているところを見つけました。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=22555

 ということで、これを参考に実験です。

 UTF-16の外字の領域を一文字ずつShift-JISに変換して、また、UTF-16に戻して、ちゃんともとにもどるか、やってみました。

public class Gaiji {
  public static void main(String[] args) throws Exception {
    final String charSet = "Shift-JIS";
    
    boolean allEqual = true;...続きを読む


人気Q&Aランキング