• 締切済み

日本語文字列の指定長(byte)切出し

以下は日本語文字列(EUC)の指定長(byte)切出し関数なのですが、 これをShift-JIS版にするにはどうすれば良いのでしょうか? ================================================================ sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } return substr($string, 0, $length); } ================================================================ 宜しくお願い致します。

  • Perl
  • 回答数2
  • ありがとう数1

みんなの回答

  • kabaokaba
  • ベストアンサー率51% (724/1416)
回答No.2

>substrはバイトでカットするため、半角、全角混じり文字列の全角の真中を切ってしまうことが有ります。 というか。。。微妙な問題なのに Perlのバージョンとか種類を書かないのはなぜ?? Perl5.6とPerl5.8でも違うだろうし, Perl4とかJperl4とか Perl5.00*と対応するJperlとか. ついでにいうと,localを使うのも意味不明だなあ. 推察するに相当古い環境ですか? 少なくとも,Perl5.8.8 on Winでは use encoding "sjis"; print substr("aあいう",1, 2); で「あい」って出てきますよ.

回答No.1

require 'jcode.pl'; sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } &jcode::convert(\$string, 'sjis'); return substr($string, 0, $length); } あるいは use Jcode; sub jcut { # 日本語文字列(EUC)の指定長(byte)切出し local($string, $length) = @_; if (substr($string,$length-1,1) =~ /[\x80-\xff]/) { $length++; } &Jcode::convert(\$string, 'sjis'); return substr($string, 0, $length); } これでいいと思います。

das_horn
質問者

補足

substrはバイトでカットするため、半角、全角混じり文字列の全角の真中を切ってしまうことが有ります。 そのため、最後尾の文字が文字化け表示されます。 これを避けるためには、カット位置が半角か全角か調べて、全角の真中であればカット位置を調整してやる必要があります。 そういう関数なのですが、Shift-JISの場合は適用できません。

関連するQ&A

  • plpgsqlでのbyte数指定での文字切り出し

    postgresql(plpgsql)にて、byte数指定での文字列切り出しを行いたいのですが、よい手法などありませんか? substr(substring)だと、文字数の指定となり、対象がマルチバイト、シングルバイト文字混在だと意図した値が取得できません。 ※Oracleのsubstrbに相当するものです。 ※select substr(カラム, 1, 20) from ...的な取得がしたいです。 よろしくお願いします。

  • 文字列について

    文字列をEUC-JPを用いてエンコードして保存したテキストをシフトJISにてデコードした場合に表示される文字を示せ。 JIS X 0208区点番号表は与えられています。 分かる方いれば是非教えてください。

  • byte[]→String変換後の文字列が違うのはなぜ?

    byte[]→String変換の処理を行っていたのですが、 使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。 byte[] bt; String str1 = "12345", str2; bt = str1.getBytes(); (1)str2 = new String(bt); (2)str2 = bt.toString(); (1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 環境に依存しない文字長(日本語含む)の取得方法

    Stringデータ(日本語含む)の文字長を取得したいと考えています。 但し、日本語は2byte文字としてカウントしなくてはいけません。 で、今まで、 String.getBytes().length; で取得していたのですが、何かのタイミングで日本語を2byteとして扱えず、 「あいうA」を4byteと算出してしまうことがありました。 それで、getBytes()の引数にgetBytes("SJIS")と明示して取得することで、環境に依存しないbyte配列変換ができるのかなぁ、、と思っていますが、 この対応は間違っていないのでしょうか? また、これ以外の日本語byte数のカウント方法で「環境に依存しない」はあるのでしょうか? ご教授願います。

  • VBScriptでEUC文字列をSJIS文字列に

    VBScript+WSHを使って、変数に入っているEUC-JP文字列をShift_JIS文字列に変換したいのですが、ウェブで情報を探しても、ファイルを扱う物ばかりです。 Set stream = CreateObject("ADODB.Stream") stream.Charset = "EUC-JP" stream.Open stream.WriteText = eucstring ' この変数にはEUC-JP で文字列が入ってる stream.Position = 0 stream.Charset = "Shift_JIS" WScript.Echo "(" & stream.ReadText & ")" とかやってみましたが、だめです。まさか「いったんファイルに書けば可能だが書かないと不可能」ということもないと思うのですが。。。。。 元のEUC-JP文字列は、xmlHTTPrequestでウェブサイトから得た物なので、その段階でShift_JISに変換する方法があるのならそれでも良いです。 よろしくお願いします。

  • 文字列を文字コードの数値に変換する方法

    JISコードの日本語を含む文字列を、文字コードの数値に変換する方法がわからなくて困っています。とりあえずは文字列ではなく、1文字だけ変換することを目指してord関数を使ったんですが、1バイト文字はうまくいったのですが、2バイト文字だと思うような結果になりませんでした。 例)以下のように変換したいです。 「a」→「97」 「あ」→「9250」 どなたかいい方法や関数をご存じないでしょうか? ちなみに下記のように片っ端から試してみたのですが、思うような結果が得られませんでした。 $buf = mb_convert_encoding($_POST["string"], "JIS", "EUC-JP"); $jis_code1 = ord("$buf"); $jis_code2 = bin2hex("$buf"); $jis_code3 = urlencode("$buf"); $jis_code4 = intval("$buf");

    • 締切済み
    • PHP
  • 文字コードを指定する際sjisなのかshift_jisかshift-jisなのか

    お世話になります。 perl5.8において文字コードを指定or変換する際 shift_jis shift-jis Shift_JIS SJIS EUC_JP EUC-JP utf-8 utf8 -と_の違いや大文字小文字の違いなど記述の違いを良く見かけるのですが、実際決まった指定方法などはあるのでしょうか。 逆に文字コードを指定する際、●●のように指定しても無効で●●のように指定しないと有効ではないですよ。。みたいな。 またperlに限らずPHPやHTML、XMLなどではどうなっているのでしょうか どなたかご存知の方いましたら ・上記3つの文字コードについてと ・perlのバージョンの違い、言語の違いなど 文字コードの文字列の指定に関する全般についてご教授願えませんでしょか。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • テキストファイル(英語&日本語)を読む時に文字化けいたします

     今晩は,いつも勉強させていただいております. 質問させていただきます.どうぞよろしくお願いいたします.  テキストファイル(ほとんどが自作のFortranコードで,英語と日本語のみで ございます)を読み込みたいのですが,全角文字の読み込み (下記コードになります)で文字化けいたします..  Dim SR As New System.IO.StreamReader(FileName, System.Text.Encoding.GetEncoding(51932))   '↑ここのエンコード(?)が怪しいのでは,などと考えている次第です.  Dim text As String = SR.ReadToEnd()  MsgBox("/" & text & "/")    '↑「text」が化けます...  エンコード(?いまいち理解しておりませんorz)の種類がおかしいのでは, というところまでなんとか行き着きまして,色々と検索いたしておりますと  http://www.atmarkit.co.jp/fdotnet/dotnettips/013enumenc/enumenc.html にまとめてくださっておりましたので,思いつく数字を「51932」の代わりに 入れてみましたが,どれも全角文字が文字化けいたします.. 「0 shift_jis 日本語 (シフト JIS) 」 「932 shift_jis 日本語 (シフト JIS) 」 「1200 utf-16 Unicode 」 「51932 euc-jp 日本語 (EUC) 」「1200 utf-16 Unicode 」  もしかすると別の部分に問題があるのかもしれませんが.. 調べておりますと, http://dobon.net/vb/bbs/log3-25/15325.html などよく似た症状なのですが,真似いたしましても解決いたしませんでした・・  もし,日本語と英語のテキストファイルすべてに通用するようなお勧め エンコード方法のようなものがございましたら,ご紹介いただきたくお願い申し上げます.  お詳しい方がいらっしゃいましたら,是非ともアドバイスいただきたく どうぞよろしくお願いいたします

  • 文字列分割方法

    フォームから入力されたデーターを文字数により4分割したい場合、 シングルバイトとマルチバイト文字列が混在していると、文字化けが起こってしまいます。 私が考えた方法は <?php $test="あああああいいいいいうううううえええええ"; $length = strlen($test); $length2 = (int)$length/4 $quarter[] = substr($test,0,$length2); $quarter[] = substr($test,$length2,$length2); $quarter[] = substr($test,$length2*2,$length2); $quarter[] = substr($test,$length2*3,$length2); echo $quarter[0]."<BR><BR>"; echo $quarter[1]."<BR><BR>"; echo $quarter[2]."<BR><BR>"; echo $quarter[3]."<BR><BR>"; ?> というものだったんですが、この場合$testに半角文字のaなどが入ると 文字化けしてしまいます。 上手く、マルチバイト・シングルバイト複合文字列を文字数により4分割する方法はないでしょうか? ご教授ください

    • ベストアンサー
    • PHP
  • 文字列比較

    最長10文字の文字列を2件入力し、char型の配列にそれぞれ格納する。2つの文字列を比較し、文字列が同じだったら「equal」を表示し異なっていたら「Not equal」を表示するプログラムを作成せよという課題が出ました。 条件として、11文字以上の文字が入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。下記のプログラムで文字列1に11文字以上入力すると、うまく動きません。なぜ、うまくいかないかと、どうなおしたらよいかを教えてください。 #include<stdio.h> #include<string.h> #define max_length 10 void get_string (char *p_str, int size); int main() { char string1[max_length+2]; char string2[max_length+2]; printf("文字列1:"); get_string(string1,max_length+2); printf("文字列2:"); get_string(string2,max_length+2); if(!strncmp(string1,string2,max_length)) puts("equal"); else puts("Not equal"); } void get_string (char *p_str, int size) { fgets(p_str,size,stdin); }

専門家に質問してみよう