Mon, January 21, 2008
Javaで文字コードを調べる... 全角スペース(ideographics space)を半角スペースに置き換える方法
テキストデータ中に含まれる全角スペースを半角スペースに置き換えるプログラム(java)を書くことになった。
ちなみに、全角スペースという用語は日本だけしか通用しないらしい。 ユニコード(unicode)的世界では、ideographics space と呼ばれているらしい。
ソースコードに直接書く
String result=aString.replaceAll(" "," ");//"全角スペース","半角スペース"
このように、
直接ソースコードに全角スペースを入れることもできなくはないが、それはちょっと問題がある。
ソースコード中に直接書いた全角スペースは、
処理対象としているテキストデータ中に含まれる全角スペースと同じ文字(コード)なのだろうか?
直接書かない(改良版)
char[] c={'\u3000'};
String wspace=new String(c);
String result=aString.replaceAll(wspace," ");
ネットで調べたところ、日本でいうところの通称全角スペースは、
ユニコードでは、u3000に該当するらしい。
したがって、u3000の文字コードで表現される全角スペースについては
上記コードでうまく対処できそうだ。
対象テキストに含まれている全角スペースが本当に u3000 の文字コードなのかを調べる
結局、見た目上全角スペースに見えているその文字のコードがなんなのか、 本当に u3000 なのかがわからないと 完全に問題(テキストデータ中に含まれる全角スペースを半角スペースに置き換える) を解くことはできない。
ということで、 対象テキストに含まれる全角スペースが本当に u3000 かを調べる Test.java というコードを書いた。
import java.io.*;
public class Test{
private static char SPACE='\u3000';
public static void main(String[] args){
if(args.length<1){
System.exit(0);
}
File f=null;
String ENC="SJIS";
if(args.length>=1)
f=new File(args[0]);
if(args.length>=2)
ENC=args[1];
try{
BufferedReader br= new BufferedReader(new InputStreamReader( new FileInputStream(f),ENC));
String line=null;
while( (line=br.readLine())!=null ){
for(int i=0; i<line.length(); i++){
if(SPACE==line.charAt(i)){
int code=(int)(line.charAt(i));
System.out.println("Found ideographics space: "+Integer.toHexString(code) );
}
else{
System.out.println(line.charAt(i));
}
}
}
br.close();
}
catch(Exception ex){
ex.printStackTrace();
}
}
}
使い方
対象テキスト(sample.txt)の文字コードがSJIS(Shift JIS)の場合
$ javac Test.java
$ java Test sample.txt
対象テキスト(sample.txt)の文字コードを指定する場合
$ javac Test.java
$ java Test sample.txt UTF-8