• ベストアンサー

javascript全角・半角混在文字列を分割する

javascriptで困っています。宜しくお願いします。エンコードはutf-8です str = "鈴木 茂\t小松商事\t部長"; (ただし、strはtext fileから読み込んだものであり、\tと表記していません。タブで区切られています。) token = str.split("\t"); これで、token[0] = "鈴木 茂", token[1] = "小松商事", token[2] = "部長"となることを期待しているのですが、どうやら 全角文字の中の0x09で分割されてしまい、意図するようになりません。 ご指導頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

ファイルから読み込む手段はどうやっていますか? FileSystemObjectのOpenTextFile、ReadLineだと UTF-8のデータは正しく扱えません。 こういう場合はADODB.Streamを使います。 var utf8 = new ActiveXObject("ADODB.Stream"); utf8.Open(); utf8.Type = 2; //テキストモード utf8.Charset = "utf-8"; //文字コード utf8.LoadFromFile("D:\\okvbs\\pm.txt"); //読み込み var ansi = new ActiveXObject("ADODB.Stream"); ansi.Open(); ansi.Type = 2; //テキストモード ansi.Charset = "shift_jis"; //文字コード utf8.CopyTo(ansi); //転送(文字コード変換含む) utf8.Close(); ansi.Position = 0; //ポインタをファイル先頭に移動 var str = ansi.ReadText(); //全てのデータを読み込む 後は今までのコーディングの通りです。 尚、ADODB.Streamでは復帰改行までの1行読み込みは 出来ないので、複数行の処理を1行ずつ行う場合には ReadText(1)として1文字ずつ読み込み、復帰改行を 検出したら、そこまで読み込んだ文字を連結して1行と するような工夫が必要です。

Radialist
質問者

お礼

早速のご回答ありがとうございました。ファイル読み込みは、prototype.jsのAjax.requireで行っています。 ただ、この質問をさせて頂いた後、再度気を取り直し、挑みましたところ、なんと今度はきちんと\t文字でsplitされ、解決されました。 どうやらご指摘の一部にもありますように、ファイルの文字コードが異なっていた可能性があります。 お忙しいところ、本当にありがとうございました。今後ともご指導宜しくお願いします。

関連するQ&A

  • 全角・半角混在の文字列から半角文字のみ取り出す

    エクセル勉強中です。問題集で理解できないところがあります。 数式がどういう意味をもつのか教えて頂けるとありがたいです。 よろしくお願いします。 画像添付の問題になります。 A列に製品名が入っています。(製品番号:半角文字)(製品名:全角文字) B列に半角文字の製品番号だけを取り出しなさいというものです。 半角文字の開始位置がバラバラになっているところが問題のポイントになっています。 回答ですが B2: =MID(A2,MATCH(1,INDEX(LENB(MID(A2,COLUMN(2:2),1))*1,0),),LEN(A2)*2-LENB(A2)) こちらで半角文字のみ取り出せるようです。回答には数式のみで何故この関数を使うのか? 使うことでどういった結果を導くなどの解説が一切ありません。(ちなみに出版会社の便利技的な問題集です) MID関数で製品名A2から開始位置を指定して、全角半角をLEN関数LENB関数で半角文字数を 算出して文字列を抽出するという事は理解できます。 ただ、この開始位置の指定の所が理解できません。 数式を分割してみましたが =MID(A2,COLUMN(2:2),1)の所はどの行も製品名の1文字目ですよね・・・ その値にLENB関数で文字数? 数式の検証で見てみると配列のような結果が次々と現れて・・・ MATCH関数もありますしINDEX関数が何か関係しているような気はしているのですが、 INDEX関数と言えば配列に行番号・列番号と例えば表の該当するセルの位置抽出の 知識しかありません。一つのセルでINDEX関数? すいません。独学で勉強していてこの程度の知識ですが、この数式の考え方教えてくださる方よろしくお願いします。

  • 全角と半角文字が混在している文字列

     このような拡張子は.csvのデータから、各データを構造体に 入れていきたいのですが、うまい読み込み方が思いつかず困っております。読み込み元はこんな感じです。 [ 2007年05月30日 ] "2007年05月30日(土) 13:07" "#0001-01" "人数 1名" "スパゲティー大盛り \2,000" "内税 (\1,905) \95" "合計 \2,000" "2007年05月30日(土) 13:12" "#0001-01" "人数 2名" "ピザ" "@1,000x2点 \2,000" "内税 (\1,905) \95" "合計 \2,000" "2007年02月17日(土) 13:23" "#0001-01" "人数 3名" "アイスクリーム \900" "ピザ" "@1,000x2点 \2,000" "内税 (\2,762) \138" "合計 \2,900"  後に売上の合計、ソートをするため「,」の除去、全角数字の半角化はできるのですが、そこからの各データの分け方、格納方法が思いつきません。  fgetsはきっちり指定したバイト数を読み込み、次の行まで読み込んでくれました。なぜかtxtで開くと横にすべてつながった状態で開いてしまいます。  fscanfは調べてて少し問題ありの関数、というような書き込みを見たような気がするので試しておりません。なるべく避けたいです。  今はfgetcで ”から ”までの範囲を読み込むという方法を試していますが、二次元配列に入るのを嫌がっているので、それを説得中です。 長くなってしまいましたが、よろしくお願いいたします。  

  • utf-8環境で標準入力からの全角文字にマッチさせる方法

    utf-8でフォーム処理のコードを書いてます。 euc-jpで動作していた全角文字の正規表現がutf-8で動作しません。 単純な「$str =~ /あ/」のような書き方ではなく、別な指定方法が必要なのでしょうか? ・perl5.8 文字コードutf-8 標準入力側文字コードutf-8 use utf8; my(%POST,$buffer,$key,$value,@data_s); if ($ENV{'REQUEST_METHOD'} eq 'POST') { if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode STDIN; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; if ( exists ($POST{$key}) ) { $POST{$key} .= '<>' . $value; } else { $POST{$key} = $value; } } } } binmode STDOUT,":encoding(utf8)"; print "Content-type: text/html; charset=utf-8\n\n"; print "<br>\n"; foreach $key (keys %POST) { if ($POST{$key} =~ /[0-9]/) { print "全角数字にマッチ<br>\n"; }###### print "$key = $POST{$key}<br>\n"; } exit;

    • ベストアンサー
    • Perl
  • 半角全角文字が混ざった文字列の分割

    半角と全角があ混ざった文字列があります。 "202号室:あいうえおかきくけこさしすせそたちつてと" これを半分に切りたいのです。 "202号室:あいうえおかきく" "けこさしすせそたちつてと" ↑この場合、202が半角であること。半分としたときに、 最後の'く'という文字がかけてしまわないことが条件なのです。 どなたかわかる方お教えください。。。

    • ベストアンサー
    • Java
  • 半角全角混在文字列の空白埋めについて

    現在SQLServer2000のデータを固定長で出力したいと考えています。 項目ごとに固定長にして、カンマ区切りにします。 既定の長さに達しない場合は、それぞれ半角空白で埋めます。 しかしいくつかの項目では、半角と全角が混在しており、うまく想定した形になりません。 項目はnvarchar型です。 SELECT文だけで行う方法を教えて下さい。 よろしくお願いいたします。 例 A(2桁)  B(20桁)    C(20桁) 01    H25/4 入金  確認済み 02    電話済み   〒123-4567

  • substr で全角半角混在の文字列を抜くには…

    全角と半角の混ざった文字列で下のようにすると、1byte文字が混ざったときの最後の1文字が文字化けします。 $kensaku = substr($namae, 0, 10); 原因は分かったので色々なサイトを調べたのですが、頭がついてきません… 全角だけのときは10byte 半角が奇数混じったときは11byte 半角が偶数混じったときは10byte を$kensaku に渡すには どの様な記述をすればいいのでしょうか? 既出の質問で申し訳ございませんが、どうぞ宜しくお願い致します。

    • ベストアンサー
    • Perl
  • SQL 全角半角混在の文字列から半角数字のみを抜き出す

    以下のようなことを「SQL文のみ」で行いたいのですが、 どなたかご教授のほどお願い致します。 下記のような変換前の文字列があるとします。 それを変換後のような形式にしたいのですが可能でしょうか? ■変換前 →2721111千葉県浦安市3-3-3浦安マンション222 ■変換後 →2721111333222 要するに数字だけを抜き出したいのですが できますでしょうか。 REGEXPのような正規表現は使用できないようです、 oracle9iです。 恐れ入りますが、よろしくお願いします。

  • 全角半角考慮した文字列分割

    A列           B列         C列 あいうえおかきくけこ  あいうえ      おかきくけこ アイウエオカキクケコ   アイウエオカキクケ  コ あいうえオかきくけこ   あいうえオ    かきくけこ A列に全角半角混在のテキスト項目があります。 B列、C列に以下のルールで分割したいのですが、Excel関数で 実現可能でしょうか?可能な場合は式をご教授して 頂けますでしょうか。宜しくお願い致します。 ※全角をバイト数指定で分割して文字化けしないように 全角半角を考慮して分割したいと考えております。 B列  A列9桁目が半角の場合は半角9文字 A列9桁目全角の場合は半角8文字(全角4文字)をB列へ C列  A列10桁目が半角の場合は、左端10桁目~半角9文字 A列10桁目が全角の場合は、左端9桁目~半角9文字

  • 半角/全角文字混在データの分割方法

    VB6.0にて、あるデータ項目の内容を、画面上の2つの表示領域に分割して セットする方法を教えて下さい。 あるファイルの項目として、「住所」という項目があるとします。 このデータを取得し、画面に表示する際に、「住所1」「住所2」とに分割して、 セットします。 この場合、ファイル上の「住所」は、キャラクタタイプで40バイトと定義されており、 ”半角/全角文字混在”でデータが格納されています。 画面上の、「住所1」「住所2」はそれぞれ、20バイトとします。 この様な条件で、単純に取得したデータを2分割すると、 取得したデータが、全て半角か全角なら問題はないのですが、 例えば、1文字目が半角で、以降が全て全角文字だった場合に、 最後の全角文字がぴったり収まらなくなり、うまく表示できないように思います。 また、文字を取得する際に、使用している、Mid(MidB)関数やLen(LenB)関数も、 うまく利用できていないようです。(コード体系の違いでしょうか?) どなたかご教授下さい。 よろしくお願いします。

  • 全角半角混在の文字列から○文字まで取得する方法

    はじめまして! MySQLから取得した文字列をPHPで例えば10文字まで表示したいのですが、良いやり方ありますでしょうか? 文字列には全角半角が混在しているので substr関数だと、うまく取得できない場合があります。よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう