[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での実際の動作イメージはコチラ
[embedSWF]http://propg.ee-mall.info/wp-content/uploads/MachineCharacterTest.swf,550, 200 [/embedSWF]
== ランキングに参加しています。ぜひクリックお願いします ==
[Flex] バリデータのエラーツールチップにスタイル指定 [Flex] spark:TextAreaのdisabled時(enabled=false時)スタイル指定