- - PR -
文字が途切れているか判定したい
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バイト目で切れていた時、ちゃんと正規表現でヒット するようにしたいのですが、どなたかアドバイスをいただけませんでしょうか? | ||||||||
|
投稿日時: 2005-02-16 03:51
正規表現は明るくないのでお力になれませんが、”文字が途切れている”とは具体的にどのような状況をさしていますか?
コード中に定義されている文字リテラルが EUC で保持されていることはありませんので new String(str.getBytes("EUC_JP"), "8859_1"); というコードはおかしいですね。 | ||||||||
|
投稿日時: 2005-02-16 09:46
パテ太と申します。
この main メソッドは全文でしょうか? とりあえずこのメソッドを実行すると
ここで enc2 が null なので NullPointerException が発生しますが
ここで例外処理を何も行っていないので 何も起こりません。 せめて e.printStackTrace() ぐらいは 実行しないと何が起こったか分からないと 思いますが・・・。 | ||||||||
|
投稿日時: 2005-02-16 09:52
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