- PR -

文字が途切れているか判定したい

1
投稿者投稿内容
会議室デビュー日: 2005/02/16
投稿数: 1
投稿日時: 2005-02-16 03:12
Javaで文字が途切れているかの判定をしたいと考えており、以下のPerlプログラムをJavaでコーディング中なんですがなかなかうまくいきません。

Perlの場合
$str の最後の文字が途切れているか判定する(文字コードがEUCであること)
if ($str =~ /\x8F$/ or $str =~ tr/\x8E\xA1-\xFE// % 2) {
print "最後の文字が途切れている\n";
}

Javaの場合
public static void main(String[] args) {
String str = "アアアアと";
String enc1 = null;
String enc2 = null;

try {
enc1 = new String(str.getBytes("EUC_JP"), "8859_1");

byte[] bytEnc = new byte[1];
ByteArrayInputStream stream = new ByteArrayInputStream(enc2.getBytes(
"8859_1"));
stream.read(bytEnc);

String enc3 = new String(bytEnc, "EUC_JP");

Pattern pattern = Pattern.compile("\\x8E\\xA1-\\xFE");
Matcher matcher = pattern.matcher(enc3);

while (matcher.find()) {
System.out.println("マッチング");
}
} catch (Exception e) {
}
}

とりあえず半角カタカナが1バイト目で切れていた時、ちゃんと正規表現でヒット
するようにしたいのですが、どなたかアドバイスをいただけませんでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-02-16 03:51
正規表現は明るくないのでお力になれませんが、”文字が途切れている”とは具体的にどのような状況をさしていますか?

コード中に定義されている文字リテラルが EUC で保持されていることはありませんので new String(str.getBytes("EUC_JP"), "8859_1"); というコードはおかしいですね。
パテ太
ベテラン
会議室デビュー日: 2004/08/16
投稿数: 64
お住まい・勤務地: 千葉・東京
投稿日時: 2005-02-16 09:46
パテ太と申します。

この main メソッドは全文でしょうか?
とりあえずこのメソッドを実行すると

引用:

あさんの書き込み (2005-02-16 03:12) より:

ByteArrayInputStream stream = new ByteArrayInputStream(enc2.getBytes(
"8859_1"));



ここで enc2 が null なので
NullPointerException が発生しますが

引用:

あさんの書き込み (2005-02-16 03:12) より:

} catch (Exception e) {
}
}



ここで例外処理を何も行っていないので
何も起こりません。

せめて e.printStackTrace() ぐらいは
実行しないと何が起こったか分からないと
思いますが・・・。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-02-16 09:52
引用:

コード中に定義されている文字リテラルが EUC で保持されていることはありませんので new String(str.getBytes("EUC_JP"), "8859_1"); というコードはおかしいですね。


str.getBytes("EUC_JP") は、Java の文字列(UTF-16LE)を EUC_JP でバイト列に符号化するという意味ですね。それを(EUCなんだけど) ISO-8859-1 とみなして String を構築すると、ほぼ無変換で String が作れるわけです。(文字化けするときなどに良く利用される方法ですね。)

ほぼ無変換 というのが曲者で、一応 Java の文字列ですから UTF-16LE になるので、下位バイトには 0x00 が詰められると思います。ようするに、ISO-8859-1 を指定して String を作っても バイト列が保持されるわけじゃないんですね。ISO-8859-1 を指定すると String <-> byte の変換で劣化が起こらないというだけです。

よって、正規表現ライブラリで EUC を前提としたコードマッチングはうまくいかないのではないかと思います。UTF-16LE になったことによる詰め物も考慮すれば、なんとかなるかもしれませんが、あまりスマートとは言えないですね。
1

スキルアップ/キャリアアップ(JOB@IT)