++C++; // 未確認飛行 C ブログ

http://ufcpp.net/

Visual Studio 2010 からソースコードを PowerPoint にコピーすると文字化けする

leave a comment »

表題のとおり。VS の不具合とするにはちょっと微妙なんですけどもねぇ・・・

症状

例えば、以下のコードをコピって

var str = "サンプル";

PowerPoint に張り付けるとこうなる↓

var str = "サTン?プvル?";

これはひどい・・・。

原因?

一応、大方の原因の予想は付いていて、たぶん、

  1. VS 2010 では、ソースコードをコピーした時に RTF 形式の場合、他バイト文字をエスケープするようになった
  2. PowerPoint がエスケープされた文字を正しく解釈しない

1はどういうことかというと、上記のソースコードをコピーした後、クリップボードの中身を RTF で GetData すると、以下のような RTF になっていることが分かります。

"{\rtf\ansi{\fonttbl{\f0 MS Gothic;}}{\colortbl;\red0\green0\blue255;\red163\green21\blue21;}\f0 \fs19 \cf1 var\cf0  str = \cf2 "\uinput2\u12469 ?T\uinput2\u12531 ??\uinput2\u12503 ?v\uinput2\u12523 ??"\cf0 ;\par }"

この、\input2\uXXXX みたいになっている部分がもともと日本語だった部分。XXXX のところには Unicode が十進数化された物が入っています。確か、VS 2008 の時は日本語も日本語のまま入ってたはず。なんでこんな仕様変更しやがりますか・・・。(GetData("text") だと普通に日本語のまま入ってるんですけどね・・・)

で、クリップボードに RTF で入ってくれてるおかげで、例えば Word に張り付けると、var とか ”” の部分の構文ハイライトの色がそのまま貼り付けできるわけなんですが、問題は、PowerPoint がこのエスケープされた文字を正しく読めないという・・・。ひどい。

対策?

バグ報告?

一応、クリップボード触れる人なら対策は取れるんですけどねぇ・・・。以下のような正規表現 Replace でいじれば。

Regex regU = new Regex(@"\uinput2\u(?<code>-?d*)s..", RegexOptions.Compiled);

string DecodeU(Match m)
{
    return new string((char)int.Parse(m.Groups["code"].Value), 1);
}

var rtf = Clipboard.GetData(DataFormats.Rtf) as string;
rtf = regU.Replace(rtf, DecodeU);
Clipboard.SetDataObject(rtf);

ないわー。

自分がなんでこんなの知ってるかって言うと、C# によるプログラミング入門のサンプルコード載せるのに使ってるから。普通そんなの知らないですよねぇ・・・。

追記:

というか、この正規表現(だいぶ前に自分で書いたもの)、よく見たら、よく分からない謎の2文字を読み飛ばして無視するような黒魔術的コードになってますねぇ。ちょうど、PowerPoint に張り付けた時に出てきてる化け文字に一致してるし、この部分が VS のバグっぽいかも。

追記2:

中さんがちょうど昨日バグ報告入れてたw うーん、RC の頃から気づいてたわけで、「英語版だからよね?」とか言わずに Connect に報告入れておくべきだったのかな。

Written by ufcpp

2010年5月11日 @ 15:19

カテゴリー: 未分類

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。