電子書籍の厳選無料作品が豊富!

初めて質問させて頂きます。
iCalendarのデータを吐き出すプログラムを作成中です。
長い項目に関して、75オクテットごとに改行(CRLF)と半角スペースを入れないといけないのですが、方法がわかりません。なお、文字コードはUTF-8で、全角・半角文字がまじっています。
なお、データ中に\nを含む場合は、それがぶった切られないようにする方法はないでしょうか?

具体例)
DESCRIPTION:あいうえおかきくけこさしすせそたちつてとなにぬね\nのはひふへほ

DESCRIPTION:あいうえおかきくけこさしすせそたちつてとなにぬね
[半角スペース]\nのはひふへほ

※上記のように75オクテット目の\とnが途中で改行されないこと。

A 回答 (1件)

1オクテット = 1バイトと考えます。


UTF-8では日本語の全角半角1文字は3から4バイトですが、OK?

> なお、データ中に\nを含む場合は、それがぶった切られないようにする方法はないでしょうか?
??よくわからず。

適当。以下、表示がくずれるので空白2文字を全角空白1文字で書いていることに注意。
use strict;
use warnings;

# for testing
my $wrap = 5;

my $string1 = 'A' x 10;
my $string2 = 'B' x 13;

for my $string ( $string1, $string2 ) {
  print qq(\x0A\x0D"$string"\x0A\x0D);
  print "---\x0A\x0D";
  while ( $string =~ m/([\x00-\xFF]{$wrap,$wrap})/g ) {
    print $1, "\x0A\x0D ";
  }
  my $rest = length($string) % $wrap;
  if ( $rest > 0 ) {
    print substr( $string, -$rest ), "\x0A\x0D ";
  }
  print "---\x0A\x0D";
}

この回答への補足

説明不足でした。
my $a = "あいうえおかきくけこさしすせそたちつてのなにぬね\\nのはひふへほ";
というデータに対して、printした際に、出力結果として

……なにぬね\
 nの…

 ではなく、

……なにぬね
 \nの……

と\nが分断されないように出力したいという意味でした。
ただ、解決策が見えてきたような気がします。ありがとうございました。

補足日時:2011/12/07 16:36
    • good
    • 0

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