WEB上でキャンペーン応募フォームを作ったのですが、半角カナを入れないでくださいとのコメントを入れても、半角カナを打つ人がいるのは避けられません。
CSVファイルにてデータを保存しなければならないのですが、正しいデータが取れません。
登録件数が多いので(数万件になります)手直しも困難な状態です。
言語はPerlを使っています。
1文字目に半角カナがなければ、変換できるモジュールは見つけたのですが、それだとフリガナの文字化けが避けられないのです。
入力時に半角カナをはじく方法、もしくはperlにて変換する方法をご存じの方がいらっしゃいましたら、教えていただけますでしょうか。
よろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

送信された文字コードが何であるかは、半角カナ以外の文字で調べる必要があります。



まず送信フォーム内に
  <INPUT type="hidden" name="dummy" value="あ">
のようにして、全角文字を送信するよう仕込んでおきます。

受け取り側CGIでは、全パラメータを分解・格納した後、キーdummyに入っていた文字をjcode::getcodeに掛け、「あ」の文字コードを得ます。
これをjcode::convertの第3引数にして変換すれば、半角カナも正しく取得できるはずです。
(つまり元コードを指定することで、別のコードとして変換されるのを防ぐわけです。)

Sample
------
# よくあるパラメータ分解・格納部分
if ($ENV{'REQUEST_METHOD'} =~ /POST/i) {
  read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
} else {
  $buffer = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$buffer);
foreach (@pairs) {
  my ($key,$val) = split(/=/,$_);
  $val =~ tr/+/ /;
  $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
  $FORM{$key} = $val;
}
# 「あ」の文字コードを調べ、全パラメータを変換
$icode = &jcode::getcode(\$FORM{dummy});
foreach (keys %FORM) {
  &jcode::convert(\$FORM{$_}, 'sjis', $icode);
}

※見易さのため全角SPを入れていますので、コピペする場合は半角SPなどに変換して下さい。
    • good
    • 0
この回答へのお礼

返信遅くなってすみません。
上記のスクリプトを入れるためには、根本的にプログラムを作り直さなければならないので、テストができませんでした。
多分、この方法で解決できると思います。
しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。
PCからの入力では半角カタカナはほとんどなかったのですが、iMODEからの入力を回避できなくて結局毎日ファイルを手直ししました。
次回試してみます。
ありがとうございました。

お礼日時:2001/10/16 20:19

> しかし、iMODEにも対応しているため、ファイルが2kまでとなっているのでフォーム内へのしかけができないんです。



仕掛けに使う「あ」の部分は、シフトJISとして jcode が認識してくれさえすれば、別のものでも構いません。
例えば、送信ボタンを仕掛けとして使えば、サイズはちょっとで済むと思いますよ。
例:
 <INPUT type="submit" name="a" value="送信">
 のようにして、デコードする時に $FORM{'a'} の値で getcode する。

この方法なら、最悪ダブルクォートを抜いたとして、HTMLは7バイトの増加で済みます。

また、$ENV{'HTTP_USER_AGENT'} を見て、iモードからの送信ならばsjisと決め打ちして変換する、なんてのも有効ですよ。
(iモードからは、必ずシフトJISで送信されてくるので。)
    • good
    • 0

csvの区切り文字をタブから,(カンマ)に変えてみてはどうでしょうか??


UNIXマシンだとタブを判別できないと思うので
    • good
    • 0
この回答へのお礼

住所やテキスト入力があるためタブ区切りを使用しています。カンマなどの記号は入力されることがあるので・・・
すみません
ありがとうございました。

お礼日時:2001/10/16 20:14

日本語文字コード変換パッケージとして有名なjcode.pl


には半角カナを全角カナに変換する関数があります。
試してみてはいかがでしょうか。下のURLに詳しい解説があります。

参考URL:http://www.mikeneko.ne.jp/~lab/kcode/jcode.html
    • good
    • 0
この回答へのお礼

ありがとうございます。
jcode.plは試したのですが、どうしても1文字目の文字化けが避けられないのです。
csvはタブ区切りにしています。

お礼日時:2001/10/03 13:24

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q正規表現で特定文字列の全角カナと半角カナの両方を検索したいと思っています。

正規表現で特定文字列の全角カナと半角カナの両方を検索したいと思っています。

たとえば リンゴ と リンゴ(半角カナ) にマッチする正規表現、ということです。

想定環境はWindowsXP Pro+秀丸7です。

意味不明でしたら加筆修正しますのでよろしくお願いします。

Aベストアンサー

リンゴ|リンゴ(半角カナ)
でどうですか?
ヘルプ→検索系コマンド→正規表現に使い方が記載されています。

QVBScriptで半角カナと半角英数字を判断する方法

VBScriptを使用して文字列が半角カナ文字か半角英数字か
を調べたいのですが方法がわかりません。

調べたところ

半角文字かどうかは
If 0<=ASC(s) And Asc(s) <=255 Then
処理
Else
処理
End If

で調べられるようなのですが、半角カナなのか半角英数文字
なのかを知るためにはどうしたらよいのでしょうか?

ANSI文字コードがわかれば半角カナと英数字とで
細かく条件を分けれそうなのですが、ANSIコードが
載っているサイトを探してもなかなかみつかりません。

どなたかよい方法をご存知でしたら教えてください。

Aベストアンサー

>半角文字かどうかは
>If 0<=ASC(s) And Asc(s) <=255 Then

まぁ、細かいことをいうとこれだと改行やらタブやらの
制御コードが混じってますけどね。

半角カナは、細かいことを言わなければ上記の範囲の後ろ半分、
128~255で問題ないです。

QCOBOLで半角カナを全角カナに変換

COBOLの初心者です。半角カナを全角カナに変換するルーチンを作成するように言われて困っています。ヒントとなるようなサンプルソースを教えて頂けないでしょうか。

Aベストアンサー

REDEFINES がちゃんと理解できていないのでしょうか。

たとえば、こんな定義をしたとします。

01 TEMP.
  05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
  05 TEMP-TEXTR REDEFINES TEMP-TEXT.
   07 TEMP-1 PIC X(02).
   07 TEMP-2 PIC X(02).
   07 TEMP-3 PIC X(02).
   07 TEMP-4 PIC X(02).
   07 TEMP-5 PIC X(02).

05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
ではメモリ上の各アドレスに次のようにデータが入ります。
アドレス  文字
ADDR0001| A
ADDR0002| B
ADDR0003| C
ADDR0004| D
ADDR0005| E
ADDR0006| F
ADDR0007| G
ADDR0008| H
ADDR0009| I
ADDR0010| J

05 TEMP-TEXTR REDEFINES TEMP-TEXT.
は メモリのADDR1からどのように項目に
割り当てるかが指定されます。

この例だと
TEMP-1 から 順に2文字ずつなので

TEMP-1には
ADDR0001| A
ADDR0002| B

TEMP-2には
ADDR0003| C
ADDR0004| D

TEMP-3には
ADDR0005| E
ADDR0006| F

TEMP-4には
ADDR0007| G
ADDR0008| H

TEMP-5には
ADDR0009| I
ADDR0010| J

割り当てられます。

REDEFINES がちゃんと理解できていないのでしょうか。

たとえば、こんな定義をしたとします。

01 TEMP.
  05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
  05 TEMP-TEXTR REDEFINES TEMP-TEXT.
   07 TEMP-1 PIC X(02).
   07 TEMP-2 PIC X(02).
   07 TEMP-3 PIC X(02).
   07 TEMP-4 PIC X(02).
   07 TEMP-5 PIC X(02).

05 TEMP-TEXT PIC X(10) VALUE 'ABCDEFGHIJ'.
ではメモリ上の各アドレスに次のようにデータが入ります。
アドレス  文...続きを読む

QVBA Shift-JISをJISに変換すると半角カナが全角に変換されてしまう

Excelから全銀フォーマットファイル(文字コード:JIS)を出力する目的で、VBAでADODB.Streamを利用して下記のサンプルコード書いた時、
半角カナが全角カナに変換されてしまう現象が解消できません。

[サンプルコード]
With CreateObject("ADODB.Stream")
.Open
.Position = 0
.Type = 2
.Charset = "iso-2022-jp"

.WriteText "(半角ア)、ア、1、1、a、a"

.SaveToFile "C:\result.txt", 2
.Close
End With

[C:\result.txtの内容]
ア、ア、1、1、a、a

解決策をご教授お願いいたします。

Aベストアンサー

解決策もなにも、iso-2022-jpに「半角カナ」は存在しません。ゲタ
にならずにカナに変換してくれるだけでもめっけものです。

全銀で使えるのはJIS X 0201の英数カナのはずなので、X0201とか、
ANKなんかのキーワードで調べて下さい。早い話がShift_JISのいわ
ゆる全角文字を削除しただけの結果になるはずです。Excel的にいう
と、asc関数で返ってくる感じかな。

QC# 半角カナの文字化けについて

こんにちは。
現在、Visual Studio 2005 C#を使っています。
ネットワーク経由で機器の情報を取得しようとしているのですが、文字化けが起きてしまいました。
調べてみると'c0','b2','d1'と帰ってきていて、これらはS-jis半角カナの'タ','イ',’ム’を表しているようです。
少し省略していますが以下のような手順で確認しています

private void buttonStart_Click(object sender, EventArgs e)
{
TcpClient client =
new TcpClient(textBoxIP.Text,int.ParstextBoxPort.Text));

NetworkStream netStream = client.GetStream();

StreamReader sr = new StreamReader(netStream);
StreamWriter sw = new StreamWriter(netStream);
sw.AutoFlush = true;

sw.WriteLine("TestCommand");
string s = sr.ReadLine();//ここで文字化け
}

StreamReader,StreamWriterの設定でEncoding指定が出来るようですが、sjisは無かったように思いました。
(defaultはUTF-8になっているようですので文字化けしたようです。)
どのようにすれば、sjisで文字列を取得できるでしょうか?

こんにちは。
現在、Visual Studio 2005 C#を使っています。
ネットワーク経由で機器の情報を取得しようとしているのですが、文字化けが起きてしまいました。
調べてみると'c0','b2','d1'と帰ってきていて、これらはS-jis半角カナの'タ','イ',’ム’を表しているようです。
少し省略していますが以下のような手順で確認しています

private void buttonStart_Click(object sender, EventArgs e)
{
TcpClient client =
new TcpClient(textBoxIP.Text,int.ParstextBoxPort.Text));

NetworkStream n...続きを読む

Aベストアンサー

>sjisは無かったように思いました。
Shift_JISはちゃんとあると思うけど?
http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx
> 932 shift_jis Japanese (Shift-JIS)

http://msdn.microsoft.com/en-us/library/wzsz3bk3%28VS.80%29.aspx

実装するのが面倒くさかったのでTCPClient使わず
byte配列をMemoryStreamに書き込んでみたコード:

using System;

namespace Q5013966
{

public class Q5013966
{

public static void Main(){

System.IO.MemoryStream s = new System.IO.MemoryStream();
s.Write(new byte[]{0xc0,0xb2,0xd1},0,3);
s.Seek(0,System.IO.SeekOrigin.Begin);
System.IO.StreamReader sr = new System.IO.StreamReader(s,System.Text.Encoding.GetEncoding(932));
System.Console.WriteLine(sr.ReadLine());
System.Console.ReadKey(true);

System.Console.WriteLine(System.Text.Encoding.GetEncoding(932).GetString(new byte[]{0xc0,0xb2,0xd1}));

}
}
}

>sjisは無かったように思いました。
Shift_JISはちゃんとあると思うけど?
http://msdn.microsoft.com/en-us/library/system.text.encoding.aspx
> 932 shift_jis Japanese (Shift-JIS)

http://msdn.microsoft.com/en-us/library/wzsz3bk3%28VS.80%29.aspx

実装するのが面倒くさかったのでTCPClient使わず
byte配列をMemoryStreamに書き込んでみたコード:

using System;

namespace Q5013966
{

public class Q5013966
{

public static void Main(){
...続きを読む


人気Q&Aランキング

おすすめ情報