[Java] 機種依存文字を含んでいるか
文字列内に機種依存文字が含まれているかどうかを調べるメソッドを作りました。
機種依存文字はたくさんあります。
1文字1文字確認したわけではないので、完全に網羅されているかは未確認です。
機種依存文字を使っていてもWindowsパソコン内の話だけであれば問題にならない場合もありますが、
他システムとの連携やメールなど外部とのやり取りをするときには、トラブルのもとです。
できれば、登録時に機種依存文字は入らないように制御すべきです。
import java.io.UnsupportedEncodingException;
public class MachineCharacterTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
// ▼機種依存ではない文字
System.out.println(hasMachineCharacters(“あ”));
System.out.println(hasMachineCharacters(“a”));
System.out.println(hasMachineCharacters(“∵”));
System.out.println(hasMachineCharacters(“¬”));
// ▼PC-9800シリーズなど、NECのパソコンが日本で主流だったころに独自に定義されていた文字
// NEC機種依存文字:13区
System.out.println(hasMachineCharacters(“①”));
System.out.println(hasMachineCharacters(“㎏”));
// ▼NECがIBMパソコンの導入を考慮した時に定義した文字
// NECのIBM拡張文字:89区
System.out.println(hasMachineCharacters(“侊”));
// NECのIBM拡張文字:90区
System.out.println(hasMachineCharacters(“犱”));
// NECのIBM拡張文字:91区
System.out.println(hasMachineCharacters(“罇”));
// NECのIBM拡張文字:92区
System.out.println(hasMachineCharacters(“霳”));
// ▼IBMが独自に定義した文字
// IBM拡張文字:115区
System.out.println(hasMachineCharacters(“彅”));
System.out.println(hasMachineCharacters(“¦”));
// IBM拡張文字:116区
System.out.println(hasMachineCharacters(“嵭”));
// IBM拡張文字:117区
System.out.println(hasMachineCharacters(“琇”));
// IBM拡張文字:118区
System.out.println(hasMachineCharacters(“詹”));
// IBM拡張文字:119区
System.out.println(hasMachineCharacters(“鮏”));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
// 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);
}
/**
* 機種依存文字を含むか
*
* @param target
* @return trueなら機種依存文字を含む
* @throws UnsupportedEncodingException
*/
public static boolean hasMachineCharacters(String target)
throws UnsupportedEncodingException {
byte charArray[] = target.getBytes("MS932");
for (int i = 0; i < charArray.length; i++) {
int charByte = charArray[i] & 0xFF;
if (isLeadByte(charByte)) {
// charByte が2バイト文字の第1バイトの場合
if (++i >= charArray.length) {
// 第2バイトが存在しない場合:エラー
return true;
}
int charByte2 = charArray[i] & 0xFF;
if (!isTrailByte(charByte2)) {
// 第2バイトが不正:エラー
return true;
}
int targetChar = (charByte <<8) | charByte2;
if ((0x8740 <= targetChar) && (targetChar <= 0x879E)) {
// 13区 (NEC特殊文字):機種依存 > Windowsでは表示できるMacで文字化け
return true;
}
if ((0xED40 <= targetChar) && (targetChar <= 0xEFFC)) {
// 89-92区 (NEC選定IBM拡張文字):機種依存 > 句点コード
return true;
}
if ((0xFA40 <= targetChar) && (targetChar <= 0xfC4B)) {
// 115-119区 (IBM拡張文字):機種依存
return true;
}
}
}
return false;
}
}
[/java]
== ランキングに参加しています。ぜひクリックお願いします ==
[Java] 文字列から全角文字のみを除去する [Flex] バリデータのエラーツールチップにスタイル指定