アプリ版:「スタンプのみでお礼する」機能のリリースについて

Perlで、SJISの16進で表記された文字があるのですが、それがうまく表示できません。
Unicodeの16進文字コードだとうまく表記できるのですが…。
以下がスクリプトです。
以下の場合だと。(句点)がSJISだと0x8142で、
その16進文字列を表示したいのですが、実行結果にあるエラーが出てしまいます。
Unicodeだと。は0x3002なのですが、うまく表示できています。
すみませんがよろしくお願いします。

----------------------------------------
# このファイルの文字コードはSJIS
# 改行コードはLF
#
# 。 SJIS 0x8142
# Unicode 0x3002
#

use Jcode;
use encoding "sjis";

$a = 0x8142;
$a = Jcode->new($a, "sjis")->utf8;

printf("句点の表示…%c\n",$a);
printf("句点の表示…%c\n",0x3002);
----------------------------------------
実行結果
"\x{8142}" does not map to shiftjis at test.pl line 14, <DATA> line 846.
句点の表示…\x{8142}
句点の表示…。

A 回答 (4件)

質問の要領を得ませんが、一応回答。



$a = 0x8142;
# 数値0x8142をShiftJisのマルチバイト文字「。」(0x81, 0x42)にする
$a = pack("C2", $a>>8, $a&0xff);
# マルチバイト文字「。」(0x81, 0x42)をワイドキャラクター「。」(\x{3002})にする
use Encode;
$a = Encode::decode("shiftjis", $a);

こんなかんじかな?どういった出力を得たいのかが不明瞭なので、勝手に解釈して返答させていただきます。
    • good
    • 0

use encoding "Shift_JIS";


use Encode;

$a = chr(0x81).chr(0x42);
$a = decode("Shift_JIS", $a);
printf("句点の表示…%s\n",$a);
printf("句点の表示…%c\n",0x3002);
    • good
    • 0

>$a = 0x8142;


意図は分りますが、perl でなら、
$a= unpack("H*",'8142');
これで、他はそのままで動くでしょう。
    • good
    • 0

失礼、下記の間違い。


$a= pack("H*",'8142');
    • good
    • 0

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