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


[Flex] 機種依存文字チェックバリデータ

前回投稿したJavaでの機種依存文字チェックをそのままFlexに移植し、バリデータクラスとして作りました。

バリデータクラス


package
{
import flash.utils.ByteArray;

import mx.events.ValidationResultEvent;
import mx.validators.ValidationResult;
import mx.validators.Validator;

/**
* 機種依存文字チェック用バリデータ
*/
public class MachineCharacterValidator extends Validator
{
/** 機種依存文字を含む場合のエラーメッセージ */
public var machineCharacterError:String = “機種依存文字が入力されています”;

public function MachineCharacterValidator()
{
super();
}

override protected function doValidation(value:Object):Array {
var results:Array = super.doValidation(value);

if (super.required || 0 < String(value).length) { if (hasMachineCharacters(String(value))) { var errorChar:Array = getErrorString(String(value)); results.push(new ValidationResult(true, null, "machine", machineCharacterError + " [" + errorChar.join(",") + "]")); } } return results; } // charByte が SJIS 2バイト文字の第1バイトのときそのときに限り真を返す. private function isLeadByte(charByte:int):Boolean { return ((0x81 <= charByte) && (charByte <= 0x9F)) || ((0xE0 <= charByte) && (charByte <= 0xFC)); } // charByte が SJIS 2バイト文字の第2バイトのときそのときに限り真を返す. private function isTrailByte(charByte:int):Boolean { return (0x40 <= charByte) && (charByte <= 0xFC) && (charByte != 0x7F); } /** * 文字列内の機種依存文字を抽出する * * @param source 抽出元文字列 * @return Array 機種依存文字を1文字ずつ配列に格納 */ private function getErrorString(source:String):Array { var result:Array = new Array(); for (var i:int = 0; i < source.length; i++) { var t:String = source.substr(i, 1); if (hasMachineCharacters(t)) { result.push(t); } } return result; } /** * 機種依存文字を含むか * * @param target * @return trueなら機種依存文字を含む * @throws UnsupportedEncodingException */ public function hasMachineCharacters(target:String):Boolean { var charArray:ByteArray = new ByteArray(); charArray.writeMultiByte(target, "Shift_JIS"); for (var i:int = 0; i < charArray.length; i++) { var charByte:int = charArray[i] & 0xFF; if (isLeadByte(charByte)) { // charByte が2バイト文字の第1バイトの場合 if (++i >= charArray.length) {
// 第2バイトが存在しない場合:エラー
return true;
}
var charByte2:int = charArray[i] & 0xFF;
if (!isTrailByte(charByte2)) {
// 第2バイトが不正:エラー
return true;
}

var targetChar:int = (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; } if ((0xF040 <= targetChar) && (targetChar <= 0xF9FC)) { // ユーザー定義外字:機種依存 return true; } } } return false; } } } [/as3] 投稿の都合上、機種依存文字チェックの関数もバリデータクラスに含めてしまいましたが、 実際には別のユーティリティクラスとしたほうがいいかもしれません。 Java版の時にも書きましたが、すべての機種依存文字のテストをしていないので、漏れがあるかもしれません。 テストクラスはコチラ、 [xml]







@namespace s “library://ns.adobe.com/flex/spark”;
@namespace mx “library://ns.adobe.com/flex/mx”;
@namespace local “*”;
global {
font-size:24;
font-family:”MS GOTHIC,Tahoma”;
}

.errorTip {
fontSize:20;
fontWeight:normal;
shadowColor: #000000;
borderColor: #ff3333;
borderStyle: “errorTipRight”; /* “errorTipRight”、”errorTipAbove”、または “errorTipBelow” */
paddingBottom: 5;
paddingLeft: 5;
paddingRight: 5;
paddingTop: 5;
}



[/xml]

最初から機種依存文字をセットしているので、フォーカスを移動すればバリデータが走り、エラーとなります。

エラーメッセージの末尾に機種依存文字を羅列するようにして、どの文字が機種依存なのかわかるようにしています。

機種依存文字の登録を、入力時点でエラーとして弾く場合に使えます。

Flexでの実際の動作イメージはコチラ

This movie requires Flash Player 9.0.0

 

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

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

コメントを残す

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