プロプログラマ -Flex,Air,C#,Oracle,HTML5+JS-

プログラマーを職業としてます。 Flex,Air,C#,Oracle,HTML+JSの言語ノウハウを中心に情報発信していきます

[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;
	}
}

 

== ランキングに参加しています。ぜひクリックお願いします ==

プログラム ブログランキングへ
にほんブログ村 IT技術ブログへ
にほんブログ村

,

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください