半角カナの文字列操作について

このQ&Aのポイント
  • 半角カナの文字列操作について説明します。通常10桁の半角カナの文字列がある場合、特定の位置で文字列を分割する方法や、濁点を含む文字列の分割方法について解説します。
  • 文字列を特定の位置で分割する方法について説明します。例えば、10桁の半角カナの文字列を半分に区切る場合、濁点が存在する場合に注意が必要です。濁点がある場合は、濁点を含んだ文字列の前か後ろで分割する方法があります。
  • 濁点を含む文字列の分割方法について説明します。例えば、10桁の半角カナの文字列で濁点が6文字目に存在する場合、濁点を含んだ文字列の前後で分割する方法があります。具体的な分割例も示しているので、参考にしてください。
回答を見る
  • ベストアンサー

半角カナの文字列操作について

通常10桁の半角カナの文字列があった場合下記のように String i = "イイイイイイイイイイ"; i.substring(0,5) + ","+i.substring(5,10) Systemout.println(i); として結果を イイイイイ イイイイイと文字列を分割しているのですが 10桁の文字列を半分に区切ろうとした場合 6文字目に濁点が存在した場合 String i = "イイイイバイバイ"; i.substring(0,5) + ","+i.substring(5,10) 結果が イイイイハ ゛イバイ と バの濁点とハが分割されてしまいます。 この半角カタカナの文字列でこの現象を 回避するために 文字列の中で濁点がヒットした場合 文字列の濁点を含んだ文字列の前か後ろで イイイイ ハ゛イバイ もしくは イイイイハ゛ イバイ のように 分割させたいのですがなにか良い方法はありませんでしょうか?? どうぞよろしくお願いします。

  • Java
  • 回答数4
  • ありがとう数4

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.3

>3分割や分割区分が複数になる場合、IF文ですと条件が増えてしまうので >なにか良い方法はないかなと思ったのですが・・・ 「分割区分が複数」というのが何の事かわかりませんが 5桁毎にn分割なら以下のような感じで書けると思いますけど。 List<String> a = new ArrayList<String>(); String s = "ハハハハバハハハハバハハハ"; int w = 5; int n = 3; for (int i = 0; (i < n - 1) && (s.length() > w); i++) { String s1 = s.substring(0, w); String s2 = s.substring(w); if (s2.startsWith("゛")) { s1 = s1 + "゛"; s2 = s2.substring(1); } a.add(s1); s = s2; } if (s.length() > 0) a.add(s);

ITJack
質問者

お礼

ソースの方どうも ありがとうございます。 あとはパ等小さい〇を考えれば 良いだけですね。 ちょっとサンプルから考えてみます。

その他の回答 (3)

noname#217196
noname#217196
回答No.4

おそらく所定の分割位置の文字が濁点のほか、半濁点、促音、拗音、かな小文字、長音の場合についても同様に調整した分割位置の割り出しが必要でしょう。 濁点、半濁点だけなら、一旦全角文字に置換してから分割後、半角文字に置換しても目的を果たせるでしょうけど、例えばデュプリーヴィクセンジャックマンのような文字列の分割時には、拗音、かな小文字、促音、長音の泣き別れに課題を残しそうです。 正規表現を使わなくても所定の分割位置の文字の一文字後ろが濁点、半濁点、拗音、促音、かな小文字、長音の場合、これら以外の文字が見つかるまで分割位置候補を一文字ずつ前方または後方に探せばいいでしょう。

ITJack
質問者

お礼

全角から半角にすべて置換するソース作りました。 アドバイスありがとうございます。

ITJack
質問者

補足

アドバイスどうもありがとうございます。 分割前に文字を全角に置換して 分割後に半角に戻す考えは今でもございます。 バやピなどの文字以外は途中で分割されてしまっても構いません。 分割前に import java.text.Normalizer; import java.text.Normalizer.Form; Normalizer.normalize(半角カナ, Form.NFKC);で 文字を全角に変換して分割しようと思ってたのですが 結果に文字を半角カナに戻すソースを ご存じでしょうか??

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>4桁目が濁点のケースもあり6桁目が濁点のケースも >あるので濁点をヒットさせて分割方法を >変えなければと思い投稿させていただきました。 5文字で分解するのに4桁目にある濁点と3桁目の文字が分かれることがあるんですか? 文字列を分割するときに濁点とその前の文字を分けたくないって質問だと思ったんですけど。

ITJack
質問者

お礼

訂正 補足例であげた分割前文字列は以下になります。 分割前の15ケタの文字列 ハハハハバハハハハバハハハ

ITJack
質問者

補足

>5文字で分解するのに4桁目にある濁点と3桁目の文字が分かれることがあるんですか? ございません。 検証の結果、単純な2分割ですとIF文で対応出来るのですが 今回説明が分かりやすいように、2等分に分割する例を上げました。 今回、伝えたかった事は 3分割や分割区分が複数になる場合、IF文ですと条件が増えてしまうので なにか良い方法はないかなと思ったのですが・・・ うまく伝わらなくて申し訳ございません。 例えば5ケタ目が濁点のとき 6ケタと5ケタと4ケタで分割したとします。 そうしますと文字列の値によっては 5ケタで分割しようとした2つ目の配列にもし 濁点が含まれていた場合また条件を増やさなければいけなかったという事です。 例 分割前 ハハハハバハハハハハ       バハハハハハ 分割後  ハハハハバ        ハハハハハ       ゛ハハハ        という結果になってしまうのです。 かといって配列2の値を6ケタで区切ると 他の文字列の 配列2の値の7ケタ目に 濁点が含まれた場合濁点と文字の途中で 分割されてしまうので・・・ なにか他に方法がなければ アドバイス頂いた方法で考えて ベストアンサーとして打ち切りさせて頂きます。

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

分割した後半部分の文字列先頭1文字が濁点だったら、前半部分の文字列最後の文字を後半部分の先頭に移すなり、後半部分の先頭の濁点を前半部分の文字列の最後に移したりすればよいだけでは?

ITJack
質問者

お礼

すいません。 勘違いしてました。 正規表現もしくは条件判定で、 ヒットさせるという事で しょうか?

ITJack
質問者

補足

文字列の値はどこに濁点が存在する かわからないのでそれですと 今回質問しなくて済んでしまいます。 4桁目が濁点のケースもあり6桁目が濁点のケースも あるので濁点をヒットさせて分割方法を 変えなければと思い投稿させていただきました。

関連するQ&A

  • 半角カナ文字の変換

    半角カナ文字(濁点あり)の全角カナ文字への変換がうまくいかなくて悩んでいます。 現在、 HashTable.put("ア","ア"); HashTable.put("ン","ン"); このような感じで変換テーブルを作成し、 String strVal = "半角カナ文字"; for(int i = 0; i < strVal.length(); i++){   char c = strVal.charAt(i); if(HashTable.containsKey(c)){ strTmp.append(HashTable.get(c)); } } このような処理をしているのですが、 半角カナ+濁点(例えば、ガ)の変換が、 「カ゛」となってしまいます。 これを「ガ」とするにはどうすればよいでしょうか?? 何か良い方法がありましたら教えてください。 お願いします。

  • 文字列を分割するクラスについて

    住所のメソッドでの開発についてご質問がございます。 仕様 住所の配列は全角80(半角160)に格納される。 住所地名の途中で分割しないようにする。 80桁すべてに文字は格納されているときは20桁の4等分にする。 スペースで分割をおこなうようにする。 例1  実行前  札幌市 ○区 北○○○○○ 00-0-0-00      実行後  札幌市 ○区 北○○○○○,00-0-0-00,,      例1の場合20桁ずつ分割を考えると14桁目のスペースを利用してカンマ区切りで4つに分割 例2 実行後  あああああ いいいいい ううううう ええ     実行後  あああああ いいいいい ううううう ええ,,,     例2の場合文字がちょうど20桁なのでちょうどカンマ区切りで4等分  例3  実行前   あああああ いいいい ううううううううううう えええええ 0-00-000       実行後   あああああ いいいい,ううううううううううう えええええ,0-00-000,      例3の場合20文字だと区切りだと、うの領域の途中になるため      11桁目のスペースを利用して分割      そしてそこから20桁目を区切ろうとして次の区切りたい場所が      番地の途中になるため実行後のように、えで区切り4等分にカンマ区切り と基本的に住所分割をスペースを利用して住所の途中や番地の途中で 区切らないでカンマ区切りの4等分にするアルゴリズムを考えています。 private void 住所漢字(String 住所漢字, String 住所カナ, String 住民票住所漢字,PrintWriter out) { //(1)分割する文字列を生成 String str = new String(住所漢字); //(2)文字列をsplitメソッドで分割 String[] strAry = str.split(",", 0); { str = 住所漢字; } for (int i=0; i<strAry.length; i++) { } out.print(str.substring(0,20)+","+ str.substring(20,40) +","+ str.substring(40,60)+","+ str.substring(60,80)); }      現在は単純に全角80桁の配列に対して 20桁ずつの4等分に実行されるだけのプログラムになってます。 上記の例のような住所分割のアルゴリズムを開発する際 StringTokenizer st = new StringTokenizerのクラスは開発に有効でしょうか? また有効である場合のソース実行例の等のアドバイス、もしくは ほかに文字を分割するための便利なクラスがございましたら ご教授ください。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 全角半角考慮した文字列分割

    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文字

  • eval 半角カナが文字化けする

    初めて投稿させていただきます。 半角カナが混ざっている文字列をevalすると、文字化けする場合があります。 どうすれば文字化けしないようになりますか? ちなみに全ての半角カナを全角カナに置換してevalを行いその後、半角カナに戻すということをやったのですが、もともと全角カナ文字まで半角カナに変換されてしまいました。できれば全角カナは全角カナ、半角カナは半角カナのまま文字化けせずにevalする方法を教えてください。

    • 締切済み
    • PHP
  • Javaで、半角カナを2バイトとしてカウントしたい

    JavaでSJISで入力された文字列(全角、半角、英字、記号等混在)の桁数チェックで、 入力された半角カナのバイト数を、2バイトとみなしてカウントしたいと考えています。 例えば  全角の"テスト"の場合、バイト数は6  半角の"テスト"の場合も、バイト数は6 Javaで以下の様にコーディングしたところ、半角カナ部分はとりあえずうまく行ったのですが、 System.out.println 半角の"テスト".getBytes("EUC-JP").length; ->6 特殊な文字「まるの1、まるの2」等で試すと、特殊な文字のバイト数が1バイトとして カウントされてしまいます。 ※まるの1、まるの2は、この質問フォームで入力できないのでこの記載としています。 以降は(1),(2)と記載します。いずれも全角1文字の文字のことです。 System.out.println "(1)".getBytes("EUC-JP").length;   ->1      ※希望結果は2バイト System.out.println "(2)スト".getBytes("EUC-JP").length;   ->5      ※希望結果は6バイト 特殊な文字「(1)、(2)」や半角カナ(2バイトとしてカウント)を含めて、 簡単にバイト数をカウントすることはできないでしょうか。

  • 全角半角を意識した文字分割

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

  • 文字列の算出について

    お世話になります。 文字列の10桁の基礎年金コードと 5桁の年金番号があったとします。 それと結合して123456789012345のように 15桁の文字列になるよう指示をだし その15桁から文字列の管理コード4桁を引き算したいのですが なにかアイデアはありますでしょうか?? 結合なしの引き算でしたら long型で宣言して 対応出来るのですが・・・ どうぞよろしくお願いいたします。 String 基礎コード = "1234567890"; String 年金番号= "12345"; String 管理コード= "5678"; System.out.println(String.format( )); System.out.println(管理番号 - 基礎年金番号);

    • ベストアンサー
    • Java
  • Androidプログラミング 文字列の切り取り

    こんにちは。 eclipseを使用してAndroidアプリを作成しているものです。 今回、文字列の切り取りに挑戦しようと思っているのですが、 調べても、 String str = "123456789"; System.out.println(String.format("取り出し前の文字列 : %s", str)); System.out.println("文字列の3文字目から7文字目を取り出す -> " + str.substring(2,7)); System.out.println("文字列の2文字目から2文字目を取り出す -> " + str.substring(1,2)); System.out.println("文字列の3文字目から3文字分を取り出す -> " + str.substring(2,2+3)); といったものしか出てきません。 eclipseではSystem.out.printは使えませんよね? 実行してももちろんなにも表示されません。 私の調べ方が悪いのかもしれませんが、、、 (「Android 文字列 切り取り」といったようにAndroidというワードは入れています。) 如何せん、プログラミング初心者なこともありまして、 これ以上手の施し方がわからない状態です。 Androidプログラミングに詳しい方、優しい方、 参考になるURLやサンプルコードを載せてくださると 助かります。 よろしくお願いいたします。

  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • substringで文字を分割

    全角80桁の文字列を全角空白を利用して4分割したいのですが 下記にご質問内容を記載します。 String str = new String(住所漢字); Matcher j = pattern2.matcher(住所漢字); Pattern pattern2 = Pattern.compile("^.{1,20} ");で 文字列の先頭から始まって半角空白で終わる最大21文字 (最後の全角空白を含む)にマッチさせた文字列に Matcher j = pattern2.matcher(住所漢字); while(j.find()) { 正規表現で抜き出した文字列の文字カウントをチェック int mojiLength = i.group().length(); String iNewString = tmp.substring(mojiLength); out.print(j.group()+","+iNewString); として、正規表現でマッチさせた文字列以降を substringで抜き出したのですが それ以降の文字列も同じようにして substringで抜き出した20文字以降の文字列に 先に設定した正規表現を利用して分割して カンマ区切の4分割にしたいのですが この先の方法が分からず色々調べている最中です。 すいませんがぜひアドバイスお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう