【データ加工・変換 No.2】半角英数字⇔全角英数字の変換

【データ加工・変換 No.2】半角英数字⇔全角英数字の変換

Goanywhere2023.06.23

半角英数字⇔全角英数字の変換

はじめに

GoAnywhereMFTは、システム間、取引先間における多種多様なデータ・ファイル連携を実現するソリューションです。

データ・ファイル連携において、それぞれ異なる形式のデータを持つ各システムに合わせたデータの加工や変換は必要不可欠となります。GoAnywhereはデータの加工・変換機能も持っており、GoAnywhereはデータの抽出・加工・変換からファイルの転送まで一元的に管理可能です。

【GoAnywhereのデータ加工・変換機能】

  • 異なる拡張子ファイルへの変換
  • ファイルの文字コードの変換
  • 日付や数字等のフォーマットの変換
  • トリム処理
  • 文字の置換処理
  • 新しいカラムの追加・削除・結合
  • 変換テーブルを利用して値の変換
しかし、実際にデータ・ファイル連携する際には、他にも様々な種類のデータ加工・変換が必要となります。

本記事では、JavaScript等の一般的な開発言語で実装可能な方法を参考に、GoAnywhereMFTでも半角英数字⇔全角英数字の変換が可能か試してみました。

一般的な開発言語の場合の実現方法

英数字

半角文字も全角文字も文字コード上で対応する並びになっているため、16進数でFEE0(10進数で65248)足し引きすることで相互に変換することが可能です。

【Unicodeの文字コード】
・半角文字:「A」の文字コードは[0041]。「z」は[007A]。
・全角文字:「A」の文字コードは[FF21]。「z」は[FF5a]。

・「半角文字」の文字コードから16進数でFEE0(「0xFEE0」)を足す⇒「全角文字」に変換
・「全角文字」の文字コードに16進数でFEE0(「0xFEE0」)を引く ⇒「半角文字」に変換

(例:JavaScript)半角文字⇒全角文字
  
Hankaku = Hankaku.replace(/[A-Za-z]/g, function(s) {
  return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
});
  
(例:JavaScript)全角文字⇒半角文字
  
Zenkaku = Zenkaku.replace(/[A-Za-z]/g, function(s) {
  return String.fromCharCode(s.charCodeAt(0) - 0xFEE0);
});
  

VB.NET等の一部言語では、標準的に文字変換の関数やメソッドが既に用意されており、容易に半角文字⇔全角文字の変換が可能です。
(例)VB.NET
StrConv関数:StrConv(String, VbStrConv, Int32)
・半角文字⇒全角文字
 StrConv('ABCD', VbStrConv.Wide)
・全角文字⇒半角文字
 StrConv('ABCD', VbStrConv.Narrow)

GoAnywhereでやってみた

上記で紹介した文字コード表の対応を活用して、GoAnywhereでも英数字の半角文字⇔全角文字の変換をやってみます。
以下の3つの処理によって変換を実装します。

  1. 対象の文字をUnicode(UTF-8)文字コードにエンコード(関数:HexEncode)
  2. Unicode(UTF-8)文字コードの一部を対応する値に置換(関数:Replace)
  3. Unicode(UTF-8)文字コードをデコードし変換後の文字を取得(関数:HexDecode)

3つの処理

  1. 対象の文字をUnicode(UTF-8)文字コードにエンコード(関数:HexEncode)

    関数「HexEncode」を使用することで、対象の文字のUnicode(UTF-8)文字コードを取得します。
    (例)
    ${HexEncode('0')} ⇒ 30
    (例)
    ${HexEncode('A')} ⇒ 41

    関数「HexEncode」:指定した文字列を16進数文字列としてエンコードする

  2. Unicode(UTF-8)文字コードの一部を対応する値に置換(関数:Replace)

    関数「Replace」を使用することで、文字コードの一部を半角⇔全角に対応する値に置換します。
    GoAnywhereでは16進数の加算減算ができないため、以下一覧より対応するそれぞれの置換処理(赤字部分)を直接指定します。

    (例)30(0)の「30」を「efbc90」に変換
    ${Replace('30', '3([0-9])', 'efbc9$1')} ⇒ efbc90
    (例)41(A)の「41」を「efbca1」に変換
    ${Replace('41', '4([0-9a-z])', 'efbca$1')} ⇒ efbca1

    関数「Replace」:指定した文字列(1つ目のパラメータ)から検索パターン(2つ目のパラメータ)に該当する文字列を指定した値(3つ目のパラメータ)に置換する

    【Unicode(UTF-8)文字コード対応一覧】
    半角文字  ⇒  全角文字
    UTF-8 UTF-8
    30 0 efbc90
    31 1 efbc91




    38 8 efbc98
    39 9 efbc99




    41 A efbca1
    42 B efbca2




    59 Y efbcb9
    5a Z efbcba




    61 a efbd81
    62 b efbd82




    79 y efbd99
    7a z efbd9a

  3. Unicode(UTF-8)文字コードをデコードし変換後の文字を取得(関数:HexDecode)

    関数「HexDecode」を使用することで、Unicode(UTF-8)文字コードをデコードして対応する文字を取得します。
    (例)
    ${HexDecode('efbc90')} ⇒ 0
    (例)
    ${HexDecode('efbca1')} ⇒ A

    関数「HexDecode」:指定した16進数文字列をデコードする

3つ処理を一つの処理に統合

GoAnywhereの関数では、入れ子式に関数を使用することが可能なため、最終的には以下のように指定することができます。

(例)「0」⇒「0」に変換
${HexDecode(Replace(HexEncode('0'), '3[0-9]', 'efbc9$1'))}
(例)「A」⇒「A」に変換
${HexDecode(Replace(HexEncode('A'), '4[0-9a-z]', 'efbca$1'))}

全ての半角文字、全角文字に対応

半角文字、全角文字をUnicode(UTF-8)文字コードにした際に、変換のパターン(「41」⇒「efbca1」等)が一つではないため、どの文字が対象の場合でも対応可能なように全ての変換パターンを関数「Replace」で指定します。

(例)数字:半角文字⇒全角文字に変換
${HexDecode(Replace(HexEncode('[半角数字]'), '3([0-9])', 'efbc9$1'))}
※[半角数字]:任意の半角数字の文字列

また、英大文字の場合、Unicode(UTF-8)文字コードにした際の文字の並びによっては、正常に変換ができない場合があります。

(正常に変換できないパターンの例)
「STUDENT」 ⇒ Unicode(UTF-8)文字コード「53545544454e54」
〇正しい置換対象:53545544454e54
×誤った置換対象:53545544454e54

そのため、以下のように変換するように指定します。
  • T(54) ⇒ T(efbcb4)
(例)英大文字:半角文字⇒全角文字に変換
${HexDecode(Replace(Replace(HexEncode(Replace('[英大文字]', 'T', 'T')), '(?<![b-f]{4}[89ab])4([0-9a-z])', 'efbca$1'), '(?<![b-f]{4}[89ab])5([0-9a-z])', 'efbcb$1'))}
※[英大文字]:任意の英大文字の文字列

英小文字の場合も同様に、Unicode(UTF-8)文字コードにした際の文字の並びによっては、正常に変換ができない場合があるため、以下のように変換するように指定します。

  • v(76) ⇒ v(efbd96)
(例)英小文字:半角文字⇒全角文字に変換
${HexDecode(Replace(Replace(HexEncode(Replace('[英小文字]', 'v', 'v')), '(?<![b-f]{4}[89ab])6([0-9a-z])', 'efbd8$1'), '(?<![b-f]{4}[89ab])7([0-9a-z])', 'efbd9$1'))}
※[英小文字]:任意の英小文字の文字列

まとめ

GoAnywhereでも関数の組み合わせによって、半角英数字⇔全角英数字の変換ができました。

数字:【半角⇒全角】

${Replace(HexEncode('[半角数字]'), '3([0-9])', 'efbc9$1')}
※[半角数字]:任意の半角数字の文字列
プロジェクト画面(半角数字⇒全角数字)

ジョブログ画面(半角数字⇒全角数字)


数字:【全角⇒半角】

${Replace(HexEncode('[全角数字]'), 'efbc9([0-9])', '3$1')}
※[全角数字]:任意の全角数字の文字列
プロジェクト画面(全角数字⇒半角数字)

ジョブログ画面(全角数字⇒半角数字)


英大文字:【半角⇒全角】

${HexDecode(Replace(Replace(HexEncode(Replace('[半角英大文字]', 'T', 'T')), '(?<![b-f]{4}[89ab])4([0-9a-z])', 'efbca$1'), '(?<![b-f]{4}[89ab])5([0-9a-z])', 'efbcb$1'))}
※[半角英大文字]:任意の半角英大文字の文字列
プロジェクト画面(半角英大文字⇒全角英大文字)

ジョブログ画面(半角英大文字⇒全角英大文字)


英大文字:【全角⇒半角】

${HexDecode(Replace(Replace(HexEncode([全角英大文字]), 'efbca([0-9a-z])', '4$1'), 'efbcb([0-9a-z])', '5$1'))}
※[全角英大文字]:任意の全角英大文字の文字列
プロジェクト画面(全角英大文字⇒半角英大文字)

ジョブログ画面(全角英大文字⇒半角英大文字)


英小文字:【半角⇒全角】

${HexDecode(Replace(Replace(HexEncode(Replace([半角英小文字], 'v', 'v')), '(?<![b-f]{4}[89ab])6([0-9a-z])', 'efbd8$1'), '(?<![b-f]{4}[89ab])7([0-9a-z])', 'efbd9$1'))}
※[半角英小文字]:任意の半角英小文字の文字列
プロジェクト画面(半角英小文字⇒全角英小文字)

ジョブログ画面(半角英小文字⇒全角英小文字)


英小文字:【全角⇒半角】

${HexDecode(Replace(Replace(HexEncode([全角英小文字]), 'efbd8([0-9a-z])', '6$1'), 'efbd9([0-9a-z])', '7$1'))}
※[全角英小文字]:任意の全角英小文字の文字列
プロジェクト画面(全角英小文字⇒半角英小文字)

ジョブログ画面(全角英小文字⇒半角英小文字)
※数字、半角英数字、全角英数字以外の文字が含まれている場合は、Unicode(UTF-8)文字コードの関係で正常に変換できない場合があるため、処理を更新する必要があります。様々な文字が混在するデータの半角英数字⇔全角英数字変換やその他種類の文字の変換等については、製品サポートにお問い合わせください。