4D-JUG
Would you like to react to this message? Create an account in a few clicks or log in to continue.

【小技】半角を全角に変換するメソッド

Go down

【小技】半角を全角に変換するメソッド Empty 【小技】半角を全角に変換するメソッド

投稿 by miyako 2016-12-20, 4:05 pm

半角を全角に変換するメソッドを書いてみました♪

Code:
C_TEXT($1;$0;$src;$dst)

$src:=$1

ARRAY LONGINT($pos;0)
ARRAY LONGINT($len;0)

$i:=1

While (Match regex("(([:East Asian Width=Halfwidth:])((?<=[[\\uFF61-\\uFF9F]-[\\uFF9E\\uFF9F]])[\\uFF9E\\uFF9F]?))";$src;$i;$pos;$len))

$hankakuKana:=Substring($src;$pos{2};$len{2})
$zenkakuKana:=Choose(Character code($hankakuKana)-0xFF61;\
"。";"「";"」";"、";"・";\
"ヲ";\
"ァ";"ィ";"ゥ";"ェ";"ォ";\
"ャ";"ュ";"ョ";\
"ッ";\
"ー";\
"ア";"イ";"ウ";"エ";"オ";\
"カ";"キ";"ク";"ケ";"コ";\
"サ";"シ";"ス";"セ";"ソ";\
"タ";"チ";"ツ";"テ";"ト";\
"ナ";"ニ";"ヌ";"ネ";"ノ";\
"ハ";"ヒ";"フ";"ヘ";"ホ";\
"マ";"ミ";"ム";"メ";"モ";\
"ヤ";"ユ";"ヨ";\
"ラ";"リ";"ル";"レ";"ロ";\
"ワ";"ン")

If ($pos{3}#-1)
$voiceMark:=Character code(Substring($src;$pos{3};$len{3}))
Case of
: ($voiceMark=0xFF9E)
$zenkakuKana:=$zenkakuKana+Char(0x3099)  //COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK
: ($voiceMark=0xFF9F)
$zenkakuKana:=$zenkakuKana+Char(0x309A)  //COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK
End case
End if
$dst:=$dst+Substring($src;$i;$pos{1}-$i)+$zenkakuKana
$i:=$pos{1}+$len{1}
End while

$dst:=$dst+Substring($src;$i)

$i:=1

$src:=$dst
$dst:=""

While (Match regex("([[:East Asian Width=Narrow:][\\uFF9E\\uFF9F\\u203E]])";$src;$i;$pos;$len))
$hankaku:=Substring($src;$pos{1};$len{1})
Case of
: (Match regex("[\\u0021-\\u007E]";$hankaku))
$zenkaku:=Char(0xFEE0+Character code($hankaku))
: (Match regex("[\\u0020]";$hankaku))
$zenkaku:=Char(0x3000)
: (Match regex("[\\u00A5]";$hankaku))
$zenkaku:=Char(0xFFE5)
: (Match regex("[\\u203E]";$hankaku))
$zenkaku:=Char(0xFFE3)
: (Match regex("[\\uFF9E]";$hankaku))
$zenkaku:=Char(0x309B)
: (Match regex("[\\uFF9F]";$hankaku))
$zenkaku:=Char(0x309C)
Else
$zenkaku:=""
End case
$dst:=$dst+Substring($src;$i;$pos{1}-$i)+$zenkaku
$i:=$pos{1}+$len{1}
End while

$dst:=$dst+Substring($src;$i)

$0:=$dst

ポイント

1.

まず,半角のカタカナを全角に変換します。

正規表現:(([:East Asian Width=Halfwidth:])((?<=[[\\uFF61-\\uFF9F]-[\\uFF9E\\uFF9F]])[\\uFF9E\\uFF9F]?))

このとき,濁音・半濁音の処理には,Combining Voice MarkというUnicodeの制御文字を使用します。
これは,マンガなどでみかける「あ」点々,アイヌで使用される「か」に丸など,どんなカナにも濁点や半濁点を追加できるというものです(実際に重なって記号が表示されるかどうかはソフトウェアに依存します)。

JISでは,50音・濁音・半濁音・小文字がまとまっていますが,
Unicodeでは,はぱば,っつづ,といった具合に,関連のある文字が並んでいます。
それで,単純に文字コードの加減算で変換ができません。
ここはChooseで強引に変換しました。

Case文や配列マップでも良いでしょう。

2.

続いて,カタカナ以外の半角文字を変換します。

正規表現:([[:East Asian Width=Narrow:][\\uFF9E\\uFF9F\\u203E]])

具体的には,下記の文字を処理しています。

a. 半角の英数記号
b. 単独で使用されている濁点・半濁点
c. JIS X 0201(日本版ASCII)の文字:半角オーバーライン・半角円マーク
d. 半角バックスラッシュ

a. については,全角文字がASCIIと同じ配列なので,単純に0xFEE0を足して変換することができます。
b., c. d. については,個別に処理します。

半角/全角というと,Shift_JISを連想しがちですが,ここで実行したいのはUnicodeからUnicodeの変換です。
カタカナやASCII英数記号だけでなく,下記の半角文字も対応する全角文字に変換するように努めました。

バックスラッシュ(U+007E)
円マーク(U+00A5)
オーバーライン(U+203E)



Code:
$src:=""

For ($i;0xFF71;0xFF9D)
$src:=$src+Char($i)+Char($i)+Char(0xFF9E)+Char($i)+Char(0xFF9F)
End for

$src:=$src+Char(0x00A5)  //backslash
$src:=$src+Char(0x203E)  //overline

For ($i;0x0020;0x007F)
$src:=$src+Char($i)
End for

$test:=全角カナ ($src)

SET TEXT TO PASTEBOARD($test)

変換結果

アア゙ア゚イイ゙イ゚ウヴウ゚エエ゙エ゚オオ゙オ゚カガカ゚キギキ゚クグク゚ケゲケ゚コゴコ゚サザサ゚シジシ゚スズス゚セゼセ゚ソゾソ゚タダタ゚チヂチ゚ツヅツ゚テデテ゚トドト゚ナナ゙ナ゚ニニ゙ニ゚ヌヌ゙ヌ゚ネネ゙ネ゚ノノ゙ノ゚ハバパヒビピフブプヘベペホボポママ゙マ゚ミミ゙ミ゚ムム゙ム゚メメ゙メ゚モモ゙モ゚ヤヤ゙ヤ゚ユユ゙ユ゚ヨヨ゙ヨ゚ララ゙ラ゚リリ゙リ゚ルル゙ル゚レレ゙レ゚ロロ゙ロ゚ワヷワ゚ンン゙ン゚¥ ̄!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

参考

プラグインを使用することもできます。

https://github.com/miyako/4d-plugin-text-convert

例:

Code:
$src:="フォーディージャパンの所在地は渋谷区道玄坂1ー10ー2"
$id:="Halfwidth-Fullwidth"
$rule:=""
$error:=ICU Transform text ($id;$rule;ICU Transform Forward;$src;$dst)
//"フォーディージャパンの所在地は渋谷区道玄坂1ー10ー2"

miyako

投稿数 : 480
登録日 : 2016/07/05

トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可