おお、スクリプトありがとうございます。やっぱり標準では対応していなかったんですね…。
あと、改行コードも含める場合は、モジュール内の
strrep texts,"\\r\\n","\n"
strrep texts,"\\n","\n"
strrep texts,"\\r","\r"
を付与すればOKなのでしょうか?
#module
#uselib "kernel32.dll"
#func lstrlenW "lstrlenW" int
#define ctype wide(%1) ((%1)*2) //UTF-16は2バイト単位で扱う
#defcfunc ucode_esc str _ent
sdim ent,strlen(_ent)*2+2 : cnvstow ent,_ent //UTF-16に変換
lstrlenW varptr(ent) : size=stat : sdim buf,wide(size+1)
p=0 : p2=0 //それぞれ書き込み元と書き込み先の位置(2バイト単位)
repeat
if p>=size : break
x=wpeek(ent,wide(p))
f1=0 //エスケープシーケンスを出力したフラグ
if p<=size-6 {
if (x='\\')&((wpeek(ent,wide(p+1))='u')|(wpeek(ent,wide(p+1))='U')) {
buf2=0 //出力バッファ
f2=0 //出力に失敗したフラグ
repeat 4,2
buf2=buf2<<4
y=wpeek(ent,wide(p+cnt))
if (y>='0')&(y<='9') {
buf2|=y-'0'
} else {
if (y>='A')&(y<='F') {
buf2|=y-'A'+10
} else {
if (y>='a')&(y<='f') {
buf2|=y-'a'+10
} else {
f2=1
}
}
}
if f2 : break
loop
if f2=0 {
wpoke buf,wide(p2),buf2
p2++ : f1=1 : p+=6
}
}
}
if f1=0 : wpoke buf,wide(p2),x : p++ : p2++
loop
texts = cnvwtos(buf)//UTF-8(もしくはsjis)にして返す
strrep texts,"\\r\\n","\n"
strrep texts,"\\n","\n"
strrep texts,"\\r","\r"
return texts
//surr_str p1
//p1にUnicodeの番号を指定すると、Unicodeエスケープシーケンスの形で返す
#defcfunc surr_str int uni
if uni>0xFFFF {
//0x10000以上の場合はサロゲートペアの形で
return strf("\\u%04x\\u%04x",(((uni-0x10000)>>10)&0x3FF)|0xD800,((uni-0x10000)&0x3FF)|0xDC00)
}
return strf("\\u%04x",uni)
#global