2012年7月23日月曜日

Windows 8 RP:SimSunの差分

Windows 8 DPでフォントのバージョンを見た際、SimSun・Gulim・PMingLiUは7と同じでした。製品版の時にでもバージョンアップするのかなと勝手に思ってたのですが、ふとRPでSimSunのバージョンが上がってるのに気づきました。なぜか収録文字数が若干減ってました。
下表はSimSunの5.03(Windows 7)と5.04(Windows 8 RP)を比較したら消えていた文字です。

Unicode 字形 範囲名
1E3F ḿ ラテン文字拡張追加
9FB4 CJK統合漢字
9FB5 CJK統合漢字
9FB6 CJK統合漢字
9FB7 CJK統合漢字
9FB8 CJK統合漢字
9FB9 CJK統合漢字
9FBA CJK統合漢字
9FBB CJK統合漢字
FE10 縦書き形
FE11 縦書き形
FE12 縦書き形
FE13 縦書き形
FE14 縦書き形
FE15 縦書き形
FE16 縦書き形
FE17 縦書き形
FE18 縦書き形
FE19 縦書き形

U+1E3FはSimSunでこの範囲に唯一あった文字で、むしろ7ではなぜ収録されていたのか謎です。何か別の文字の代替にでも使われてたのでしょうか。


まぁコメントで使われることは無いと思いますけど(CJK統合漢字の8文字も)。
縦書き形の10文字は、デザイン的に使われることがあるかもしれません。8RPでは全部豆腐です。


7では単独でSimSunが表示されているのですが、これらがSimSun化文字というわけではありません(ちなみにWindowsコードページに定義はありません)。8RPの豆腐の形から、これらはMicrosoft Sans Serifのフォントリンクで表示されているのだろうと思いました。


調べてみると、フォントリンク先になっている他のCJKフォントにこれらの文字はありませんでした。
試しに7でフォントリンクからSimSunを削除すると8RPと同じ表示になりました。


なんでMicrosoft Sans Serifなのか、その事の方が気になりましたが。
しかし表示されていた文字がバージョンアップで無くなることもあるんですね(ニコニコプレーヤーで表示されない他のフォントには収録されています)。侮れないなと思いました。

2012年7月19日木曜日

Excel 2010×2003:テキストボックスの文字色がズレる

そう言えばWindows 8 RPにOffice 2013入れてみたのですが、まだ全然いじってません。とりあえず白っぽくて見づらいな(特にリボン)と思いました。
新機能がいろいろ気になるので、時間がある時に遊んでみたいと思います。

さて、ちょっと変なことがあったので。
下図はExcel 2003上のテキストボックスに文字を入れたところです。半角英字の部分だけ色を変えました。


ここで半角英字の前に改行を入れ、保存して閉じます。


このファイルを2010で開いてみたところ。


特に問題ありません。何も変更を加えず、上書き保存だけして閉じます。
ところがこれを再び2003で開いてみると、おかしなことになってました。


英字部分の文字色が途中まで黒に戻っています。2010で開くと元の通りで変化はありませんでした。

調べてみたところ、常にこのような現象が起きるわけではないようでした。たぶん条件としては、

  • 全角文字+半角文字(2バイト文字+1バイト文字?) の組み合わせ
  • 半角文字の前に改行
  • 半角文字のみ文字色を変更

ということみたいでした。改行がポイントっぽいところがおもしろいなと思いました。
初めに2010で作った場合、このような差異は発生しないようでした。

翌日追記:
ふと、Excelのメニューの文字列にはところどころにU+200B(ゼロ幅文字)が挿入されていることを思い出しました。あれってもしかして、表示上のなんらかのバグを回避するためのものなのでは・・・まぁわかりませんけど。

試しに上のケースで半角文字の前にゼロ幅文字を入れてみました。
U+200Bを入れると2010でもズレて、その後2003で開くとさらにズレてました。
ところがU+200C(同じくゼロ幅文字) を入れてみたところ、この現象は起きなくなりました。実際ちょっと困ってたのでこれで解決です。仕組みは不明なままですが、実に興味深いので覚えておこうと思います。

2012年7月9日月曜日

BabelMapが便利すぎる

BabelStone : BabelMap (Unicode Character Map for Windows)

この名前は前から知っていたのですが、パッと見よくあるフォントビューアかな?+英語だからよくわかんないや、と試してませんでした。先日たまたま再び見かけてふと試したところ、とんでもない、かなり高機能なツールでした。フォントに関してちゃんとした知識があるわけではないですけど、それでも少しいじっただけでコメントのフォントを調べるのに使えそうな機能をいくつか見つけることができました。

メインの画面には文字一覧や検索欄が配置されています。文字一覧で任意の文字をクリックすると、一番下のボックスへ入力されます。この部分のテキストは自由に編集することができて、文字を文字コードへ変換したりクリップボードへコピーしたりすることもできます。


代替表示がされてしまうフォントビューアだと、表示の字形が指定したフォントのものかどうか区別がつきません。しかしこの一覧はフォントのCMapデータに基づく表示であるようです。

上のメニューで、その他様々な機能を持ったサブ画面が開くようになっています。
まず便利!と思ったのがFont Coverageという画面です。文字コードや文字列を指定して、その文字のグリフを含むフォント名を一瞬で抽出してくれます。


Composite Font Mappingsという画面では、Unicodeのブロックごとに文字数・対応フォント・各フォントに含まれる文字数などのデータや、実際に表示させた場合のサンプルを見ることができます。


またFont Informationという画面ではフォントのバージョン情報などの他、CMapを取得することもできます。


「Copy CMAP Subtable」 をクリック後、Excelへ貼りつけたところ:


これまでは、MicrosoftのTTFDumpというツールで一々フォントファイルから書き出していました。こんな簡単にできるものがあったとはw

Export Font Glyphsという画面はグリフを画像として出力するためのもののようですが、フォントを変更しながら指定した文字の拡大した字形を見ることができます。


拡張領域にも対応しているので、Windows 8では大量に追加された絵文字などを見たり調べたりするのにも使えます。


話がそれますけど、来年Windows 7のSP2が来るんじゃないかという話をどこかで読みました。
もし本当なら、その時にフォントのバージョンアップでこの絵文字なども対応してくれないかなぁと期待しています。8のユーザーは絵文字の存在に気づいたら、(コメントに限らず)使いたがるんじゃないかと思うからです。現在のままだと7以前では豆腐だらけになってしまいます。

これでコメントのフォントを調べるのがだいぶ手軽になるように思います。いろいろ勉強になったとは言え、今までずいぶん無駄なことをやってしまいました。もっと早く試すべきでした。

2012年6月26日火曜日

Access:隠しオブジェクトの判定

Access 2010のナビゲーションウィンドウが使いづらい!
2003のデータベースウィンドウの詳細表示のように、テーブル名・説明・更新日時・作成日時が横に並んでほしいんですが。じゃあ自分で作ってしまえ、とやってた時のことです。

テーブルの一覧を取得しようと思って下記のようなコードを書きました。

Dim db As DAO.Database
Dim td As DAO.TableDef
Dim prop As Variant
Dim sTemp As String
    Set db = Application.CurrentDb
    For Each td In db.TableDefs
        sTemp = "テーブル名:" & td.Name
        sTemp = sTemp & vbTab & "更新日時:" & td.LastUpdated
        sTemp = sTemp & vbTab & "作成日時:" & td.DateCreated
        For Each prop In td.Properties
            If prop.Name = "Description" Then
                sTemp = sTemp & vbTab & "説明:" & td.Properties("Description")
                Exit For
            End If
        Next
        Debug.Print sTemp
        sTemp = ""
    Next

ちなみにDescriptionは「説明」を書いてないとプロパティ自体が無い状態なので、調べる処理をしています。
まぁこれでできるんですけど、いらないシステムオブジェクトまで取得してしまいます。


ググってみると、テーブル名のプレフィックスを利用して

If Not td.Name Like "MSys*" Then

みたいに判定して除外しているコードをよく見かけました。
でも稀なケースながら、自分でテーブルを隠しオブジェクトにしていることもあります。


TableDefのAttributesプロパティでシステムオブジェクトまたは隠しオブジェクトを除外する、という判定のしかたもあったのですが

If ((td.Attributes And dbSystemObject) Or (td.Attributes And dbHiddenObject)) = 0 Then

非表示のオブジェクトということで一度に判定できないのか?と思って調べたらありました:

SetHiddenAttribute メソッド - MSDN ※ここにあるGetHiddenAttribute

If Not Application.GetHiddenAttribute(acTable, td.Name) Then

これだけでシステムオブジェクトも隠しオブジェクトも判定できました。便利。

2012年6月23日土曜日

Segoe UI化という現象

下図はU+0531(アルメニア文字)を含んだコメントを見ているところです。


7と8RPで微妙に字形が異なります。見た目だけの判断ですが、7はTahoma・8RPはSegoe UI(いずれもボールド)ではないかと思います。
さて、これがフォント変化に関係するかという話です。隣接させた「あ」は何も変化していません。

U+263Aを隣接させてみます。U+263Aはデフォルト(単独)および半角英数字に隣接した状態ではArial、ゴシックに隣接するとゴシックで表示されるという挙動をとります。



隣接するのが「a」でもU+0531でも違いはありません。

ここでU+263AをU+2639に替えてみます。この文字はArialには無いという点がU+263Aとは異なります。デフォルトおよび半角英数字との隣接では豆腐になります。


U+0531との隣接で違いが出ました。「半角英数字との隣接」は「Arialとの隣接」と言い換えるべきかなと思いました。
問題は7と8RPで表示されるものが異なることです。8RPの字形はSegoe UI Symbolです。


U+0531のフォントが違うからかもしれません。
7のSegoe UIにアルメニア文字はありませんでした。TahomaからフォントリンクでMS UI Gothicということかも。U+2639の字形はMSゴシックもMS明朝もMS UI Gothicも一緒です。

次にCJKフォント変化の中で異なるケースを見てみます。下図の3・4・5段目は先頭にU+3016というSimSun化文字を置いています。SimSunにU+263Aは無いため代替表示が起こります。


U+263Aは単独でU+3016に接するとSimSun化の影響を受け、「a」に接するとArialに戻り、後ろにCJK文字「あ」が接すると再びSimSun化の影響を受けています。
7ではSimSunのフォントリンクによりMS P明朝が代替表示されていると思われます。
MICROSS(Microsoft Sans Serif) ・PMingLiUにU+263Aはありません。


ところが8RPで表示されているのはSegoe UI Symbolの字形です。


なぜかと考えたのですが、SimSunのフォントリンクが参照されないということはこのU+263AにSimSunは適用されてないんでしょう。でもSimSun化の影響でフォントが変化していることに間違いはありません。
「SimSun化の影響によるSegoe UI化」とでも言うしかないです。

どうしてこんなことにこだわるのかと言えば、実際のコメントで使われそうな特殊文字の領域でこうした差異が発生しているからです。最後に、さらに7と8RPで異なるケースを見てみます。

今度はU+2641という文字です。これはArialに無く、7でのデフォルトはMSゴシック(か明朝かUI Gothic、区別はつきません)です。SimSunにも無いので上と同じく代替表示が起きます。


7のSimSun化で字形がずいぶん違いますが、これはPMingLiUの字形です。


8RPでは単独で「あ」と接したケース以外すべて7と字形が異なります。これもSegoe UI Symbolなのかなと思います。こうして見るとほんとカオスですけど、むしろ挙動の比較ができることでフォント変化という謎現象が見えやすくなるのかもという気もします。

ところで話題のMicrosoft Surface、いいですね!8はデスクトップで使うつもりなのでRTを買ってしまうかもしれません。しかし今さらですが、RTの搭載フォントってどうなってるんだろう?
8とRTとでまたコメントの表示が違ったら、おもしろ・・・困りますねー

2012年6月11日月曜日

VBA:URLを既定のブラウザで開く

VBAから任意のURLをブラウザで開こうとするとき、ExcelならHyperlinkのFollowというメソッドがあります。

Private Const URL = "http://bardiel-of-may.blogspot.jp"

Public Sub TEST()
    ActiveSheet.Hyperlinks.Add(Anchor:=Range("A1"), Address:=URL).Follow
End Sub

URLは既定のブラウザで開くようです。ブラウザが起動していれば新しいタブで開きます。

しかし、これだとセルに書き込みをしないとできません。既に使用されているシートでは危険です。かと言って、そのために新規のシートを追加して後で削除するとか、そのためにDisplayAlertsをFalseにしてTrueに戻すとか、それをユーザーに見せないためにScreenUpdatingをFalseにしてTrueに戻すとか・・・よけいな処理もあんまりやりたくありません。今までは下記のようにやってました。

Dim objIE As Object
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True
    objIE.Navigate (URL)

既定のブラウザがなんであれIEで開くんですが。
また、実行するたびに新しいIEが起動してしまいます。それについては下記のように対処してました。

Dim objShell As Object
Dim objWindows As Object
Dim objWindow As Object
Dim objIE As Object

    Set objShell = CreateObject("Shell.Application")
    Set objWindows = objShell.Windows()
    'IEが開いているか探す
    For Each objWindow In objWindows
        If StrConv(objWindow.FullName, vbUpperCase) Like "*IEXPLORE.EXE" Then
            Set objIE = objWindow
            Exit For
        End If
    Next
    '開いていなければ起動
    If objIE Is Nothing Then
        Set objIE = CreateObject("InternetExplorer.Application")
        objIE.Visible = True
    End If

    objIE.Navigate (URL)

ただし「IEが開いているか探す」の部分は、状況によってはエラーになります。Outlookで引っかかったのですが、WindowオブジェクトにFullNameが無いケースがあるようです。
と言うか、この後IEを操作するならともかくURLを開くだけならもっとかんたんにできんのか?

それにユーザーがふだんIEを使っているとは限りません。
やはり既定のブラウザで開くようにしたい。レジストリで取得できるみたいですけど:

ShellExecute を使用して、既定の Web ブラウザーを起動するには - Microsoftサポート

あらためて調べたら、こんないろいろ考えなくてもいい方法がありました。

Run メソッド - MSDN

Dim objWSH As Object

    Set objWSH = CreateObject("WScript.Shell")
    objWSH.Run URL, 1

これだけで既定のブラウザで開くようです(起動してる場合は新しいタブで開く)。2つ目の引数でウィンドウの状態も指定できます。もっと早く知るべきでしたw

2012年6月3日日曜日

Windows 8 RPで見てみた

Windows 8 Release Previewなかなか快適です。
DP版のときはMetroが嫌でオフにして使っていました。7の動作がちょっと苦しい古いマシンに入れてますが、デスクトップUIだけだとかなり軽快でした。CP版ではそれができず、起動もMetroの動作もちょっとモッサリ感がありました。RP版ではそのようなストレスを感じません。

CP版を使っているうちにMetroにも慣れてしまったので、たぶん新しいマシンに入れたら7よりこっちを使いたくなるでしょう。UIの変貌ぶりがいろいろと揶揄されることもありますが(自分も当初はそうでしたw)、そうした予想に反して意外と成功するんじゃないかなという気がしてます。
あとはMetroスタイルのアプリがどれだけ充実していくかじゃないでしょうか。それまではデスクトップ側がメインで、Metro側はランチャー+おまけ的にMetroアプリみたいな使い方になると思います。

さてニコニコです。
まだIEとFirefoxしか試してませんが、デスクトップ側でFlash Playerをインストールすればふつうに見れます。

6/9追記:
一昨日MetroのIEでも見られるようになっているのに気づきました。MetroのIEに組み込まれたFlash Playerは決められたサイトでのみ有効になるという話でしたが、ニコニコもそのサイトとして指定されたんでしょうか。

コメントの表示については今のところCP版と変わらないように見えます。あくまでベータ版だからと考えていた未知の挙動は、結局このまま製品版の仕様になるんじゃないかと・・・仕組みはわからないですけど。


この件についてあらためて簡単に書いておきます。上の図はブロック文字U+2588でSimSun化したコメントです。ニコニコマーク(U+263A)はSimSunにありませんので別のフォントのグリフが代替で表示されます。
下図はSimSunのフォントリンクで、7も8も内容は同じです。


Microsoft Sans Serif(MICROSS)・PMingLiUにU+263Aはありません。結果としてMS P明朝のグリフが表示されるはずで、7の表示は正にその通りです。 しかし8の方は後ろに「あ」をつけると別のものが表示されています。これはおそらくSegoe UI Symbolであろうと思われます。


文字によってこの挙動は起きなかったり、「あ」をつけなくても起きたりします。デザインが違うだけならともかく、コメント幅まで変わってしまうのが問題です。このまま製品版の仕様になるのであればパターンを突き止めてみたいです。

そのSegoe UISymbolですが、DPからCPにアップグレードした際は字数が増えるととともに特徴の一つであるケータイ絵文字(拡張領域)のデザインが一新されたりしました。今回そのような大きな変化は無いようです。
下表はバージョンごとの収録文字数の変遷です。

Segoe UI Symbol 5.00(Win7) 5.33(8DP) 5.46(8CP) 5.55(8RP)
BMP領域 2,693 3,564 3,695 3,807
拡張領域 171 983 1,397 1,410
2,864 4,547 5,092 5,217

BMPで増えているのは主に私用領域で、下図はその一部です。Metroアプリ用のアイコンか何かでしょうか。


拡張領域でちょっとだけ増えているのは顔絵文字でした。あいにくコメントで表示はできませんでした(何をやっても豆腐化)。


ユニコード6.1以降で使用できる顔型絵文字 - 世界の特殊文字ウィキ

Unicode 6.0の絵文字はだいたい表示できるので、何が違うのか気になります。