<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>tk-engineering.com Technical blog</title>
	<atom:link href="http://blog.tk-engineering.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.tk-engineering.com</link>
	<description>To explore strange new systems. To seek out new bugs and new coding horrors. To boldly go where no man has not wanted to go before.</description>
	<lastBuildDate>Sat, 04 Feb 2012 01:04:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>続：ạに関する諸問題</title>
		<link>http://blog.tk-engineering.com/2012/02/04/%e7%b6%9a%ef%bc%9aa%cc%a3%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/</link>
		<comments>http://blog.tk-engineering.com/2012/02/04/%e7%b6%9a%ef%bc%9aa%cc%a3%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/#comments</comments>
		<pubDate>Sat, 04 Feb 2012 00:57:07 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=546</guid>
		<description><![CDATA[Windows の標準ベトナム語入力からạを入力すると二文字になるというのは、前回の記事。 ですが、Wikipedia上では、一文字の「合成済み」が標準として使われているようです。（Wikipediaの規約などを調べたわ &#8230; <a href="http://blog.tk-engineering.com/2012/02/04/%e7%b6%9a%ef%bc%9aa%cc%a3%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Windows の標準ベトナム語入力からạを入力すると二文字になるというのは、前回の記事。
</p>
<p>ですが、Wikipedia上では、一文字の「合成済み」が標準として使われているようです。（Wikipediaの規約などを調べたわけではないので推測です。）
</p>
<p>なので、ベトナム語版Wikipedia で「ホーチミン」のページを開くと、URLは下図のようになります。(Firefox 10 の場合。)
</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a12.png" alt=""/>
	</p>
<p>URLをWord に貼り付けると、こうなります。
</p>
<p><a href="http://vi.wikipedia.org/wiki/H%E1%BB%93_Ch%C3%AD_Minh">http://vi.wikipedia.org/wiki/H%E1%BB%93_Ch%C3%AD_Minh</a>
	</p>
<p>
 </p>
<p>さて、このURLをWindowsから手入力してみます。&#8221; Hồ_Chí_Minh&#8221;を上記URLの/wiki/ の後に貼り付けます
</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a22.png" alt=""/>
	</p>
<p>URLを同様にWordに貼り付けると、こうなります。
</p>
<p><a href="http://vi.wikipedia.org/wiki/H%C3%B4%CC%80_Chi%CC%81_Minh">http://vi.wikipedia.org/wiki/H%C3%B4%CC%80_Chi%CC%81_Minh</a>
	</p>
<p>
 </p>
<p>二つのURLは厳密には違うところに注意してください。
</p>
<p>しかしながら、Wikipediaは両者を「同じもの」とみなして、同じ内容を表示しています。
</p>
<p>
 </p>
<p>ここまで来るともう少し意地悪してみたくなります。
</p>
<p>これら二つの「ホーチミン」を検索エンジンに投入するとどうなるのか？
</p>
<p>さっそくBingとGoogleでやってみました。(Firefoxの検索ボックスから投入しただけという、実に手抜きなテストです。)
</p>
<p>それぞれ、上段が合成文字、下段が合成済み文字です。
</p>
<div>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width:66px"/>
<col style="width:537px"/></colgroup>
<tbody valign="top">
<tr>
<td style="padding-left: 7px; padding-right: 7px">
<p>Bing</p>
</td>
<td style="padding-left: 7px; padding-right: 7px">
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a32.png" alt=""/><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a42.png" alt=""/></p>
</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px">
<p>Google</p>
</td>
<td style="padding-left: 7px; padding-right: 7px">
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a52.png" alt=""/>
						</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/020412_0056_a62.png" alt=""/></p>
</td>
</tr>
</tbody>
</table>
</div>
<p>
 </p>
<p>なかなか見事な結果がとれました。
</p>
<p>Bingはこれら二つを「別のもの」として扱っています。そのため、検索結果は大きく割れて、合成文字で入力した場合には欲しい情報が得られない可能性があります。
</p>
<p>Googleはこれら二つを「同一のもの」として扱っています。結果はほぼ同じです（1億超を全部比較したわけではないので断定はしません）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2012/02/04/%e7%b6%9a%ef%bc%9aa%cc%a3%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ạ に関する諸問題</title>
		<link>http://blog.tk-engineering.com/2012/01/29/%e1%ba%a1-%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/</link>
		<comments>http://blog.tk-engineering.com/2012/01/29/%e1%ba%a1-%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/#comments</comments>
		<pubDate>Sun, 29 Jan 2012 09:53:13 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=536</guid>
		<description><![CDATA[日本人があまり目にすることはない字ですが、確かに世の中に存在します。 ベトナム語で使用される文字です。&#8221;a&#8221;に、声調記号の.が付加された文字です。 （豆：thanh nặnh という声調を表す記 &#8230; <a href="http://blog.tk-engineering.com/2012/01/29/%e1%ba%a1-%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>日本人があまり目にすることはない字ですが、確かに世の中に存在します。<br />
ベトナム語で使用される文字です。&#8221;a&#8221;に、声調記号の.が付加された文字です。<br />
（豆：thanh nặnh という声調を表す記号です。）</p>
<p>で、この文字を、Windows から標準ベトナム語入力を使用して入力すると、<br />
U+0061 (Latin Small Letter A)<br />
U+0323 (Combining Dot Below)<br />
の二文字になります。二文字ですが、aの真下にドットが描画されるのが正しい動きです。考慮されていないフォントの場合には、aの次に文字化け記号が表示されることがあります。</p>
<p>ところが、同じ文字を iOS から入力してみたところ、<br />
U+1EA1 (Latin Small Letter A With Dot Below)<br />
という文字になりました。</p>
<p>前回の記事 <a href="http://blog.tk-engineering.com/2012/01/22/%E7%B6%9A%EF%BC%9A%E3%80%8C%E3%81%8C%E3%80%8D%E3%81%A8%E3%80%8C%E3%81%8B%E3%82%99%E3%80%8D%E3%81%AF%E7%AD%89%E3%81%97%E3%81%84%E3%81%8B%EF%BC%9F/">続：「が」と「が」は等しいか？</a> の問題が「何から入力したか」によっても発生するわけです。</p>
<p>どちらが正しいとかそういう話ではなく、混乱の元になりそうな話ではあります。<br />
何も考えずに単に「文字」として比較すると酷い目にあえそうな、そんな感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2012/01/29/%e1%ba%a1-%e3%81%ab%e9%96%a2%e3%81%99%e3%82%8b%e8%ab%b8%e5%95%8f%e9%a1%8c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>続：「が」と「が」は等しいか？</title>
		<link>http://blog.tk-engineering.com/2012/01/22/%e7%b6%9a%ef%bc%9a%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/</link>
		<comments>http://blog.tk-engineering.com/2012/01/22/%e7%b6%9a%ef%bc%9a%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 01:37:12 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=531</guid>
		<description><![CDATA[前回は「が」の話でしたが、今度は「ệ」です。以前「今更な文字列長の話」で取り上げた文字です。 これをWindows 7 + 標準のベトナム語入力メソッド で入力すると、合成文字になります。ê ： U+00EA に、声調 &#8230; <a href="http://blog.tk-engineering.com/2012/01/22/%e7%b6%9a%ef%bc%9a%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>前回は「が」の話でしたが、今度は「ệ」です。<br/>以前「<a href="http://blog.tk-engineering.com/2011/12/25/%E4%BB%8A%E6%9B%B4%E3%81%AA%E6%96%87%E5%AD%97%E5%88%97%E9%95%B7%E3%81%AE%E8%A9%B1/">今更な文字列長の話</a>」で取り上げた文字です。
</p>
<p>これをWindows 7 + 標準のベトナム語入力メソッド で入力すると、合成文字になります。<br/><span style="font-family:Meiryo UI">ê</span>  ： U+00EA に、声調記号の下ドット U+0323  (Combining Dot Below) が結合しています。
</p>
<p>ですが、「が」の時と同じように、全く同じ文字が別のコードに割り当てられています。
</p>
<p>「ラテン拡張追加」の U+1EC7 に &#8220;Latin Small Letter E With Circumflex and Dot Below&#8221; として <span style="font-family:Arial Unicode MS">ệ</span> が割り当てられています。たとえば Wikipedia 上では、こちらの U+1EC7 を使うのが一般的なようです。
</p>
<p>そこで簡単な実験。Wikipedia で「<a href="http://ja.wikipedia.org/wiki/%E3%83%99%E3%83%88%E3%83%8A%E3%83%A0">ベトナム</a>」のページを開きます。画面右にベトナム語での国号が書かれています。ブラウザ内検索 [Ctrl] + [F] で「ê」を検索します。<br/>結果は、「ヒットしない」です。（IE9 と Firefox 9.0.1 で検証）<br/><span style="font-size:10pt">（まぁこのページで実験していただいてもよいのですが…）</span>
	</p>
<p>確かに文字コードとしては別物ですが、ユーザーはそうは考えないかもしれません。<br/>例えば、なぜ画面上に表示されている「か<span style="font-family:Meiryo UI">゙</span>」を検索できないのかを義母に説明するとか、そういうことを考えるとちょっと恐ろしくなります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2012/01/22/%e7%b6%9a%ef%bc%9a%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>「が」と「が」は等しいか？</title>
		<link>http://blog.tk-engineering.com/2012/01/14/%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/</link>
		<comments>http://blog.tk-engineering.com/2012/01/14/%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 05:52:07 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[文字コード]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=517</guid>
		<description><![CDATA[間違い探しクイズのような感じですが、この二つの「が」は厳密には違います。 「が」 &#8211; U+304C 「が」 &#8211; U+304B U+3099 と、異なる文字で記述しています。見た目は（フォントな &#8230; <a href="http://blog.tk-engineering.com/2012/01/14/%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>間違い探しクイズのような感じですが、この二つの「が」は厳密には違います。</p>
<p><span style="font-family: Meiryo UI; font-size: 10pt;">「が」 &#8211; U+304C<br />
</span></p>
<p><span style="font-family: Meiryo UI; font-size: 10pt;">「が」 &#8211; U+304B U+3099<br />
</span></p>
<p>と、異なる文字で記述しています。見た目は（フォントなどによりますが）一緒です。話がややこしくなるので、1文字の方を「<span style="color: #c00000;">が</span>」、2文字の方を<span style="font-family: Meiryo UI; font-size: 10pt;">「<span style="color: #9bbb59;">が</span>」とします。<br />
(U+3099 は、&#8221;Combining Katakana-Hiragana Voiced Sound Mark&#8221; という名前がついています。結合文字用の濁点です。)<br />
</span></p>
<p><span style="font-family: Meiryo UI; font-size: 10pt;">なお、手元の環境 (Win7　+ ATOK) で「が」を入力すると1文字の方の</span>「<span style="color: #c00000;">が</span>」でした。</p>
<p>ということは、String.Length をとると…</p>
<p><span style="font-family: Meiryo UI; font-size: 10pt;">「</span><span style="color: #c00000;">が</span><span style="font-family: Meiryo UI; font-size: 10pt;">」 = 1<br />
</span></p>
<p><span style="font-family: Meiryo UI; font-size: 10pt;">「<span style="color: #9bbb59;">が</span>」 = 2<br />
</span></p>
<p>となります。さらに、これらを入れたStringを比較すると…</p>
<pre name="code" class="vb">
Dim strOne As String = "が"  '---一文字の方です

Dim strTwo As String = "が"  '---二文字の方です

MsgBox(strOne = strTwo) '---FALSE が表示される</pre>
<p>となります。確かにString オブジェクトの中身という観点では正しい挙動なのですが、見た目が同じなのでかなりややこしい問題の元になりそうです。</p>
<p>これをこうしてみます。</p>
<pre name="code" class="vb">
Thread.CurrentThread.CurrentCulture = New Globalization.CultureInfo("ja-JP")

MsgBox(String.Equals(strOne, strTwo)) '---FALSEが返却されます

MsgBox(String.Equals(strOne, strTwo, StringComparison.CurrentCulture)) '---TRUEが返却されます</pre>
<p>後者のコードは、明示的に&#8221;ja-JP&#8221;カルチャーで比較するようにしたものです。</p>
<p>このあたりについては、<a href="http://msdn.microsoft.com/ja-jp/library/dd465121.aspx">MSDN : .NET Framework で文字列を使用するためのベスト プラクティス</a> に詳しいのですが、やたらと話が入り組んでいてわかりにくいのが難点です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2012/01/14/%e3%80%8c%e3%81%8b%e3%82%99%e3%80%8d%e3%81%a8%e3%80%8c%e3%81%8c%e3%80%8d%e3%81%af%e7%ad%89%e3%81%97%e3%81%84%e3%81%8b%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>書評：Cooking for Geeks</title>
		<link>http://blog.tk-engineering.com/2011/12/26/%e6%9b%b8%e8%a9%95%ef%bc%9acooking-for-geeks/</link>
		<comments>http://blog.tk-engineering.com/2011/12/26/%e6%9b%b8%e8%a9%95%ef%bc%9acooking-for-geeks/#comments</comments>
		<pubDate>Mon, 26 Dec 2011 12:42:53 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[書評]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=513</guid>
		<description><![CDATA[Cooking for Geeks &#8211; 料理の科学と実践レシピ 発行：オライリー・ジャパン 書店のオライリーの棚に料理本という「？」な状況に思わず買ってしまいました。まぁ、趣味としての料理も嫌いではないので。 &#8230; <a href="http://blog.tk-engineering.com/2011/12/26/%e6%9b%b8%e8%a9%95%ef%bc%9acooking-for-geeks/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<h1><a href="http://amzn.to/swHePb" target="_blank">Cooking for Geeks &#8211; 料理の科学と実践レシピ</a></h1>
<h4>発行：オライリー・ジャパン</h4>
<p>書店のオライリーの棚に料理本という「？」な状況に思わず買ってしまいました。まぁ、趣味としての料理も嫌いではないので。</p>
<p>さて、&#8221;for Geeks&#8221;と銘打っているだけあって、書き方はいろいろとそそります。食材の「入力」、時間と温度の「変数」など。<br />
タンパク質の温度による変性、フライパンの材質による熱伝導と反応速度、材料加熱・解凍における熱勾配など、科学的に解説されていて、実に興味をそそりますし、勉強になります。</p>
<p>しかしながら、良くも悪くも米国の書籍の翻訳です。本文中に出てくる各単位系がヤード・ポンド系なのは実に残念です－例えばグラフの軸は華氏ではなく摂氏にすべきではなかったのでしょうか。<br />
同様に、どうやっても米国風の肉中心・デザートが中心で、魚はあまり登場しません。さらに、米国食品医薬品局の基準やニューヨーク州の食品衛生基準など、別にどうでもよろしいという気もします。日本の家庭には普通存在しない（設置も難しい）機材の使い方を懇切丁寧に説かれても如何かと思います。（液体窒素なぞ常人には手に入りません－が、そこはネタの章なので。）</p>
<p>まとめ：<br />
立ち読みで十分です。その上で、料理の化学に興味があるのでしたらどうぞ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/26/%e6%9b%b8%e8%a9%95%ef%bc%9acooking-for-geeks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>今更な文字列長の話</title>
		<link>http://blog.tk-engineering.com/2011/12/25/%e4%bb%8a%e6%9b%b4%e3%81%aa%e6%96%87%e5%ad%97%e5%88%97%e9%95%b7%e3%81%ae%e8%a9%b1/</link>
		<comments>http://blog.tk-engineering.com/2011/12/25/%e4%bb%8a%e6%9b%b4%e3%81%aa%e6%96%87%e5%ad%97%e5%88%97%e9%95%b7%e3%81%ae%e8%a9%b1/#comments</comments>
		<pubDate>Sun, 25 Dec 2011 03:51:54 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=496</guid>
		<description><![CDATA[相当に今更感があるのですが、文字列長の話です。 普通に考えれば、string.Lenth か、Len(String) 取ればいいんじゃね？と思うのですが、残念ながら…というお話です。 よーくMSDNを読んでみて下さい。  &#8230; <a href="http://blog.tk-engineering.com/2011/12/25/%e4%bb%8a%e6%9b%b4%e3%81%aa%e6%96%87%e5%ad%97%e5%88%97%e9%95%b7%e3%81%ae%e8%a9%b1/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>相当に今更感があるのですが、文字列長の話です。<br />
普通に考えれば、string.Lenth か、Len(String) 取ればいいんじゃね？と思うのですが、残念ながら…というお話です。</p>
<p>よーくMSDNを読んでみて下さい。<br />
まずは、<a title="String.Length プロパティ " href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;l=JA-JP&amp;k=k%28SYSTEM.STRING.LENGTH%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-VB%29&amp;rd=true" target="_blank">String.Length の解説</a><br />
「プロパティ値」に「現在の文字列の文字数。」と書いてありますが、その下の「解説」の冒頭に、「Length プロパティは、このインスタンス内の Char オブジェクトの数を返します。Unicode 文字の数ではありません。」と書いてあります。</p>
<p><strong>Char の数 ≠ 文字の数</strong></p>
<p>ということです。これがどういうコトかは、後ほど改めて説明します。</p>
<p>お次は <a title="Strings.Len メソッド (String)" href="http://msdn.microsoft.com/ja-jp/library/ez71k3ay.aspx" target="_blank">Len</a> です。<br />
こちらも「文字列内の文字数または変数を格納するために必要な公称バイト数を表す整数を返します。」と書かれています。この「または」以下がくせ者です－まるで法律の但し書き条項のようにくせ者です。<br />
解説欄をよく読むと、まるでVB6以前のファイルの扱い方の解説を読んでいるような気分になります－FilePutなんて何時の話だと…。</p>
<p>どちらも何故こんな回りくどい言い回しをしているのか？何故素直に「文字列長」と言えないのか。<br />
そもそも、VB.NETに移行することによって、 Len と LenB の混乱から逃れたのではなかったのか。</p>
<p>残念ながら、そうではないのです。<br />
理由は大きく分けて二つあります。<br />
一つは「サロゲートペア（代用対）」問題。Unicodeの16bitから溢れて、32bit(=Char 二つ分)で一文字を表す文字が存在することです。更に悪いことに、日本語にはそれにが居るということです。<br />
もう一つは、他の言語で使われる「合成文字」です。こちらもコードとしては2byte以上（合成するだけ）必要ですが、表現する文字としては「１文字」です。濁点・半濁点を考えてもらえれば良いでしょう（実際、一部の体系ではそうですし）。</p>
<p>これらの問題を解決した上で「文字列」の長さをきちんと数えるには、<a title="StringInfo クラス" href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&amp;l=JA-JP&amp;k=k%28SYSTEM.GLOBALIZATION.STRINGINFO%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-VB%29&amp;rd=true" target="_blank">System.Globalization.StringInfo</a> を使用しなければいけないのです。</p>
<p>論より証拠。実際にやってみましょう。</p>
<p><a href="http://blog.tk-engineering.com/wp-content/uploads/9fbdc1f2d6dc0f44c09389ee27bbf413.png"><img class="alignnone size-medium wp-image-497" title="文字数カウント" src="http://blog.tk-engineering.com/wp-content/uploads/9fbdc1f2d6dc0f44c09389ee27bbf413-300x200.png" alt="" width="300" height="200" /></a><br />
こんなモノを用意してみます。一番上のテキストボックスに入れたTextの文字数を表示するというモノです。</p>
<p>コードはこんな感じです。ここでは実験が目的なので、何も考えずにコードビハインドに書きます。</p>
<pre class="vb" name="code">    Private Sub cmdExec_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles cmdExec.Click
        Dim strTarget = Me.txtTest.Text
        '一つめのテキストボックスには、単純にString.Length
        Me.txtLength.Text = strTarget.Length.ToString()
        '二つ目はLEN
        Me.txtLength2.Text = Len(strTarget).ToString()
        '三つめは国際化対応
        Dim g As New System.Globalization.StringInfo(strTarget)
        Me.txtLength3.Text = g.LengthInTextElements.ToString
    End Sub</pre>
<p>では、実行結果。</p>
<p>まずはとりあえず「あ」でテストしてみます。<br />
<a href="http://blog.tk-engineering.com/wp-content/uploads/8c0c3027e3cfc3d644caab3847a505b0.png"><img src="http://blog.tk-engineering.com/wp-content/uploads/8c0c3027e3cfc3d644caab3847a505b0-300x200.png" alt="" title="あ" width="300" height="200" class="alignnone size-medium wp-image-498" /></a><br />
どれも一文字と表示しています。</p>
<p>次はサロゲートペア（代用対）の問題です。<br />
よく知られているのは「&#x20B9F;る」ですが、その辺りの一覧は<a href="http://itpro.nikkeibp.co.jp/article/COLUMN/20061211/256519/" title="Vistaで化ける字，化けない字 " target="_blank">コチラ</a>にあります。<br />
<a href="http://blog.tk-engineering.com/wp-content/uploads/0d0b90010ff27b554c9639a0083d5a5a.png"><img src="http://blog.tk-engineering.com/wp-content/uploads/0d0b90010ff27b554c9639a0083d5a5a-300x200.png" alt="" title="しかる" width="300" height="200" class="alignnone size-medium wp-image-499" /></a><br />
見事に割れました。見ての通り、「文字数」としての正解は「１文字」なので、正しく値を返しているのは、System.Globalization.StringInfo のみということになります。</p>
<p>このサロゲートペア（代用対）は、確かに高頻度に現れる問題ではないとはいえ、ハマるとデカいという落とし穴になっています。コードを書く側もテストする側も、「お約束のヒトネタ」として押さえておくと良いでしょう。</p>
<p>＃おまけ：[アクセサリ]→[システムツール]→[文字コード表]でも、Unicodeの直接入力が4文字まで(!)です。&#x20B9F;(U+20B9F)はどうするんだと…<br />
<em>＃もう一つ。wordpress を使用しているのですが、素のママで&#x20B9F;(U+20B9F)を投入したら、そこで投稿が打ち切られました（内部でなんか落ちたのかなと…）。これで小一時間悩みました…。こうなりますと言うことで。</em></p>
<p>最後に、外国語の合成文字の問題です。<br />
日本語の濁点・半濁点付きの文字も「一文字」として割り振られています。例えば、「が」は U+304C です。が、そうではない言語もあります。ここではベトナム語を取り上げます。（現代の）ベトナム語は、アルファベットと声調記号の合成で表現されます。例えば「ベトナム」のことは&#8221;Việt Nam&#8221;と書きますが、これの&#8221;ệ&#8221;は、実は合成文字で二文字です。が、実際上は１文字として認識されます。（「が」を二文字と数える日本人がどれだけ居ますか？というのと同じです。）<br />
<a href="http://blog.tk-engineering.com/wp-content/uploads/9ab7c6476ab909d0fef1a58193135cdc.png"><img src="http://blog.tk-engineering.com/wp-content/uploads/9ab7c6476ab909d0fef1a58193135cdc-300x200.png" alt="" title="越" width="300" height="200" class="alignnone size-medium wp-image-500" /></a><br />
こちらもズレました<br />
バイト数で切ると、文や語の途中で打ち切られる可能性があります。</p>
<p>と言う訳で、文字列長とバイト長は使い分けましょうというお話でした。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/25/%e4%bb%8a%e6%9b%b4%e3%81%aa%e6%96%87%e5%ad%97%e5%88%97%e9%95%b7%e3%81%ae%e8%a9%b1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VB.NET で Razor記法を試す</title>
		<link>http://blog.tk-engineering.com/2011/12/18/vb-net-%e3%81%a7-razor%e8%a8%98%e6%b3%95%e3%82%92%e8%a9%a6%e3%81%99/</link>
		<comments>http://blog.tk-engineering.com/2011/12/18/vb-net-%e3%81%a7-razor%e8%a8%98%e6%b3%95%e3%82%92%e8%a9%a6%e3%81%99/#comments</comments>
		<pubDate>Sun, 18 Dec 2011 01:00:38 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=484</guid>
		<description><![CDATA[ASP.NET MVC3 といえば Razor が重要なポイントですが、それをVB.NETでやろうとするとどうなるのか。 基本的には@の使い方なので、C#とさしたる違いはなさそうに見えます。が、そうも行かない微妙な差異が &#8230; <a href="http://blog.tk-engineering.com/2011/12/18/vb-net-%e3%81%a7-razor%e8%a8%98%e6%b3%95%e3%82%92%e8%a9%a6%e3%81%99/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>ASP.NET MVC3 といえば Razor が重要なポイントですが、それをVB.NETでやろうとするとどうなるのか。</p>
<p>基本的には@の使い方なので、C#とさしたる違いはなさそうに見えます。が、そうも行かない微妙な差異があります。<br />
C# だと .cshtml だったのが .vbhtml になるというファイルの拡張子の話もありますが、まぁそれは置いておきます。</p>
<p>まず、いきなり一行目から違います。</p>
<pre name="code" class="vb">
@ModelType ...[モデル名]
</pre>
<p>同じコードをC#で書くと…</p>
<pre name="code" class="csharp">
@model ...[モデル名]
</pre>
<p>となります。Visual Studio からViewの追加を行った場合には自動的に追加してくれるのですが、サンプルをコピって…という場合には一瞬困ります。</p>
<p>次はこちらです。</p>
<pre name="code" class="vb">
@Code
    ViewData("Title") = "ホーム ページ"
End Code
</pre>
<p>これをC#にすると</p>
<pre name="code" class="csharp">
@{
    ViewData["Title"] = "ホーム ページ"
}
</pre>
<p>となります。この&#8221;Code&#8221; &#8220;End Code&#8221; がなんともかんとも…という感じです。</p>
<p>この冒頭部を乗り越えてしまえば、.vbhtml内はC#とほとんど…と言いたいところですがそうは行きません。<br />
たとえば、ループ処理内で詳細ページへのリンクと国名・国コードを出すようなコードはこんな感じになります。<br />
(AdventureWorks の CountryRegion, CountryRegionCurrency を使って書いた例です。）</p>
<pre name="code" class="vb">
    @For Each country In Model
        @&lt;tr&gt;
            &lt;td&gt;@Html.ActionLink("詳細", "Detail",New With{.CountryRegionCode = country.CountryRegionCode}) &lt;/td&gt;
            &lt;td&gt;@country.Name [@country.CountryRegionCurrencies.Count]</td>

            &lt;td&gt;@country.CountryRegionCode&lt;/td&gt;
        @&lt;/tr&gt;
    Next
</pre>
<p>Forループの書式もですが、匿名オブジェクトの作成方法と初期化方法にも注意が必要です。<br />
匿名オブジェクトはMVC3では頻出です。New と With に気をつけてサンプルから持ってきても&#8221;.&#8221;を忘れがちです。</p>
<p>さらに、詳細ページでは…</p>
<pre name="code" class="vb">
        &lt;td&gt;@Html.DisplayFor(Function(x) x.CountryRegionCode)&lt;/td&gt;
        &lt;td&gt;@Html.DisplayFor(Function(x) x.CurrencyCode)&lt;/td&gt;
</pre>
<p>Html.DisplayFor など、引数にLinqの式をとる構文の場合、このような冗長な感じになってしまいます。<br />
この例では一行で済んでいますが、複数行で&#8221;End Function&#8221;まで書く羽目になった日にはかなり涙目です。</p>
<p>やはり、<strong>VB.NETでのラムダ式は、もう少し簡素な方式を望みたいところであります。</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/18/vb-net-%e3%81%a7-razor%e8%a8%98%e6%b3%95%e3%82%92%e8%a9%a6%e3%81%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Razorコードの色</title>
		<link>http://blog.tk-engineering.com/2011/12/15/razor%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e8%89%b2-2/</link>
		<comments>http://blog.tk-engineering.com/2011/12/15/razor%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e8%89%b2-2/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 01:17:40 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[チラシの裏]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=479</guid>
		<description><![CDATA[Visual Studio のコードの色について。 他と同じように、[ツール(T)]→[オプション(O)] から[環境]→[フォントおよび色] で他と同じように変更できるのですが、「Razor コード」という設定項目があ &#8230; <a href="http://blog.tk-engineering.com/2011/12/15/razor%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e8%89%b2-2/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Visual Studio のコードの色について。
</p>
<p>他と同じように、[ツール(T)]→[オプション(O)] から[環境]→[フォントおよび色] で他と同じように変更できるのですが、「Razor コード」という設定項目があるので、それだろうと思うと、ちょっと残念なことになります。
</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/121511_0117_Razor1.png" alt=""/>
	</p>
<p>「Razor コード」だけ設定すると、こんな感じになってしまいます。
</p>
<p>中の&#8221;ViewData…&#8221;という部分が&#8221;Razorコード&#8221;で、&#8221;@Code&#8221;, &#8220;End Code&#8221; の部分は&#8221;HTML サーバーサイドスクリプト&#8221;だからです。
</p>
<p>黄色い部分が&#8221;HTMLサーバーサイドスクリプト&#8221; にあたります。
</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/121511_0117_Razor2.png" alt=""/>
	</p>
<p>なので、
</p>
<p><img src="http://blog.tk-engineering.com/wp-content/uploads/121511_0117_Razor3.png" alt=""/>
	</p>
<p>この部分も忘れずに変更する必要があります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/15/razor%e3%82%b3%e3%83%bc%e3%83%89%e3%81%ae%e8%89%b2-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VBで書くラムダ式</title>
		<link>http://blog.tk-engineering.com/2011/12/11/vb%e3%81%a7%e6%9b%b8%e3%81%8f%e3%83%a9%e3%83%a0%e3%83%80%e5%bc%8f/</link>
		<comments>http://blog.tk-engineering.com/2011/12/11/vb%e3%81%a7%e6%9b%b8%e3%81%8f%e3%83%a9%e3%83%a0%e3%83%80%e5%bc%8f/#comments</comments>
		<pubDate>Sun, 11 Dec 2011 07:11:34 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://blog.tk-engineering.com/?p=462</guid>
		<description><![CDATA[LINQはうまく使えば非常に便利なのですが、残念ながらVBで書くと非常にゴチャゴチャします。C# なら =&#62; で済む所が、Function やら Sub やら長ったらしく、しかも使い分ける必要があるのが悩みどころで &#8230; <a href="http://blog.tk-engineering.com/2011/12/11/vb%e3%81%a7%e6%9b%b8%e3%81%8f%e3%83%a9%e3%83%a0%e3%83%80%e5%bc%8f/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>LINQはうまく使えば非常に便利なのですが、残念ながらVBで書くと非常にゴチャゴチャします。C# なら =&gt; で済む所が、Function やら Sub やら長ったらしく、しかも使い分ける必要があるのが悩みどころです。どういう感じになるか、ひとつやってみます。</p>
<p>お題：小田急線の列車種別・線別の停車駅をクエリして、コンソールに出力します。「正解」は<a href="http://www.odakyu.jp/station/by_train/" target="_blank">コチラ</a>です。</p>
<p>Step1: 駅名を保持するクラスを用意します。列車種別と線名にFlags属性が付いているところに注意してください。</p>
<pre class="vb" name="code">    Private Class Station

        &lt;Flags()&gt;
        Friend Enum TrainKind
            各停 = 1
            区間準急 = 2
            準急 = 4
            多摩急行 = 8
            急行 = 16
            快速急行 = 32
            特急 = 64
        End Enum

        &lt;Flags()&gt;
        Friend Enum Line
            小田原線 = 1
            多摩線 = 2
            江ノ島線 = 4
        End Enum

        Property 駅名 As String
        Property 線 As Line
        Property 停車 As TrainKind

    End Class</pre>
<p>Step2:上で作ったクラスに初期値を入れておきます。 Sub main の冒頭でやっておけば十分です。(全駅を書くと大変なので、一部だけにします。）</p>
<pre class="vb" name="code">        Dim colStations As New List(Of Station)
        With colStations
            .Add(New Station With {.駅名 = "代々木上原", .線 = Station.Line.小田原線, .停車 = Station.TrainKind.多摩急行 Or Station.TrainKind.快速急行 Or Station.TrainKind.急行 Or Station.TrainKind.準急 Or Station.TrainKind.区間準急 Or Station.TrainKind.各停})
            .Add(New Station With {.駅名 = "豪徳寺", .線 = Station.Line.小田原線, .停車 = Station.TrainKind.区間準急 Or Station.TrainKind.各停})
            .Add(New Station With {.駅名 = "登戸", .線 = Station.Line.小田原線, .停車 = Station.TrainKind.多摩急行 Or Station.TrainKind.急行 Or Station.TrainKind.準急 Or Station.TrainKind.区間準急 Or Station.TrainKind.各停})
            .Add(New Station With {.駅名 = "向ヶ丘遊園", .線 = Station.Line.小田原線, .停車 = Station.TrainKind.特急 Or Station.TrainKind.急行 Or Station.TrainKind.準急 Or Station.TrainKind.区間準急 Or Station.TrainKind.各停})
            .Add(New Station With {.駅名 = "栗平", .線 = Station.Line.多摩線, .停車 = Station.TrainKind.急行 Or Station.TrainKind.多摩急行 Or Station.TrainKind.区間準急 Or Station.TrainKind.各停})
            .Add(New Station With {.駅名 = "南林間", .線 = Station.Line.江ノ島線, .停車 = Station.TrainKind.急行 Or Station.TrainKind.各停})
        End With</pre>
<p>Step3:早速クエリを作ってみます。条件は「小田原線内の多摩急行停車駅」です。まずは、一行で条件を書いてみます。</p>
<pre class="vb" name="code">        Dim queryInLine = colStations.Where(Function(x) (x.停車 And Station.TrainKind.多摩急行) AndAlso (x.線 And Station.Line.小田原線)) _
                            .Select(Function(y) New With {.result = y.駅名 &amp; "[" &amp; y.線.ToString() &amp; "]"})

        For Each stationName In queryInLine
            Console.WriteLine(stationName.result)
        Next</pre>
<p>一行で書こうとするとやはりゴチャゴチャします。<br />
このうちwhereの部分だけををC# で書くとすると、</p>
<pre class="csharp" name="code">var query = colStations.Where(x =&gt; (x.停車.HasFlag(Station.TrainKind.多摩急行)) &amp;&amp; (x.線.HasFlag(Station.Line.小田原線)));</pre>
<p>と、かなりすっきりするのですが、ないものねだりをしても仕方がありません。</p>
<p>また、Selectで匿名クラスを作っています。匿名クラスのメンバーであろうと、インテリセンスは補完してくれます。</p>
<p>Step4:同じ条件で、複数行で書いてみます。VS2010からは「暗黙の行継続文字」という機能がついたので、狂ったように&#8221;_&#8221;を付けなくていいところが救いです。「暗黙の行継続文字」が適用される条件については、<a href="http://msdn.microsoft.com/ja-jp/magazine/ee336123.aspx" target="_blank">コチラ</a>をご覧下さい。</p>
<pre class="vb" name="code">        Dim queryWithLines = colStations.Where(Function(x)
                                                   Return (x.停車 And Station.TrainKind.多摩急行) _
                                                            AndAlso _
                                                          (x.線 And Station.Line.小田原線)
                                                   End Function
                                ).ToArray()

        Array.ForEach(queryWithLines, Sub(station As Station)
                                      Console.WriteLine(String.Format("{0} [{1}]", station.駅名, station.線))
                                  End Sub)</pre>
<p>確かに冗長ですが、見通しはかなり良くなりました。</p>
<p>なお、Array.ForEachの中で直接Console.WriteLineを呼んでで見ましたが、ここは&#8221;Sub&#8221;であるところに注意してください。つまり、値を返さないので、&#8221;Function&#8221;ではないのです。この使い分けが若干面倒ではあります。</p>
<p>Step5：最後に、デリゲートを使ってみます。</p>
<pre class="vb" name="code">                Dim fncFilter = Function(x As Station)
                            Return (
                                (x.停車 And Station.TrainKind.多摩急行) _
                                AndAlso _
                                (x.線 And Station.Line.小田原線))
                            End Function

        Dim fncWriteLine = Sub(x As Station)
                               Console.WriteLine(String.Format("{0} [{1}]", x.駅名, x.線))
                           End Sub

        Dim queryUseDeligate = colStations.Where(Function(x) fncFilter(x))
        Array.ForEach(queryUseDeligate.ToArray(), Sub(x As Station) fncWriteLine(x))</pre>
<p>C#の「匿名メソッド」のようなものです（<a href="http://msdn.microsoft.com/ja-jp/magazine/ee336123.aspx" target="_blank">コチラ</a>によると厳密には違うそうですが）。ここでは細かいことは気にせず、「こういうやり方もありますよ」ということで。<br />
デリゲートの変数名とか書く場所に気をつけてあげれば、見通しの良いコードになりそうな気がします。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/11/vb%e3%81%a7%e6%9b%b8%e3%81%8f%e3%83%a9%e3%83%a0%e3%83%80%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>文字列の数値変換</title>
		<link>http://blog.tk-engineering.com/2011/12/11/%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e6%95%b0%e5%80%a4%e5%a4%89%e6%8f%9b/</link>
		<comments>http://blog.tk-engineering.com/2011/12/11/%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e6%95%b0%e5%80%a4%e5%a4%89%e6%8f%9b/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 15:10:00 +0000</pubDate>
		<dc:creator>tkinugaw</dc:creator>
				<category><![CDATA[.NET]]></category>

		<guid isPermaLink="false">http://www.tk-engineering.com/blog/?p=451</guid>
		<description><![CDATA[受け取った文字列を数値にしなければいけない時、ざっと3通りの方法が用意されています。 Integer.Parse(String) Convert.ToInt32(String) CInt(String) または CTyp &#8230; <a href="http://blog.tk-engineering.com/2011/12/11/%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e6%95%b0%e5%80%a4%e5%a4%89%e6%8f%9b/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>受け取った文字列を数値にしなければいけない時、ざっと3通りの方法が用意されています。</p>
<ul>
<li>Integer.Parse(String)</li>
<li>Convert.ToInt32(String)</li>
<li>CInt(String) または CType(String, typename)  VBのみ</li>
</ul>
<p>これらがどう違うのか、実験コードを書いてみます。</p>
<pre name="code" class="vb">Sub Main()

    Console.WriteLine("Input number...")
    Dim strOriginal As String = Console.ReadLine()

     Try
        Dim intCastResult As Integer = Integer.Parse(strOriginal)
        Console.WriteLine("int.Parse : {0}", intCastResult)
    Catch ex As Exception
        Console.WriteLine("int.Parse failed.")
    End Try

    Try
        Dim intConvert As Integer = Convert.ToInt32(strOriginal)
        Console.WriteLine("Convert.ToInt32 : {0}", intConvert)
    Catch ex As Exception
        Console.WriteLine("Convert.ToInt32 failed.")
    End Try

    Try
        Dim intCtype As Integer = CType(strOriginal, Integer)
        Console.WriteLine("Ctype : {0}", intCtype)
    Catch ex As Exception
        Console.WriteLine("Ctype failed.")
    End Try

    Console.WriteLine("Hit any key...")
    Console.ReadKey()
End Sub</pre>
<p>これを実行してみると、以下のようになります。<br />
&#8220;123,456&#8243; (カンマ区切りされた数値)<br />
<span style="color: #00ff00;"> Input number&#8230;</span><br />
<span style="color: #00ff00;"> 123,456</span><br />
<span style="color: #00ff00;"> int.Parse failed.</span><br />
<span style="color: #00ff00;"> Convert.ToInt32 failed.</span><br />
<span style="color: #00ff00;"> Ctype : 123456</span><br />
<span style="color: #00ff00;"> Hit any key&#8230;</span></p>
<p>&#8220;\123456&#8243; (通貨記号をつけてみた)<br />
<span style="color: #00ff00;">Input number&#8230;</span><br />
<span style="color: #00ff00;"> \123456</span><br />
<span style="color: #00ff00;"> int.Parse failed.</span><br />
<span style="color: #00ff00;"> Convert.ToInt32 failed.</span><br />
<span style="color: #00ff00;"> Ctype : 123456</span><br />
<span style="color: #00ff00;"> Hit any key&#8230;</span></p>
<p><span style="color: #00ff00;">&#8220;$123456&#8243; (ではドル記号で)</span><br />
<span style="color: #00ff00;"> Input number&#8230;</span><br />
<span style="color: #00ff00;"> $123456</span><br />
<span style="color: #00ff00;"> int.Parse failed.</span><br />
<span style="color: #00ff00;"> Convert.ToInt32 failed.</span><br />
<span style="color: #00ff00;"> Ctype failed.</span><br />
<span style="color: #00ff00;"> Hit any key&#8230;</span></p>
<p>&#8220;123.456,45&#8243; (海外の３桁区切り）<br />
<span style="color: #00ff00;"> Input number&#8230;</span><br />
<span style="color: #00ff00;"> 123.456,45</span><br />
<span style="color: #00ff00;"> int.Parse failed.</span><br />
<span style="color: #00ff00;"> Convert.ToInt32 failed.</span><br />
<span style="color: #00ff00;"> Ctype failed.</span><br />
<span style="color: #00ff00;"> Hit any key&#8230;</span></p>
<p>&#8220;&amp;hFE&#8221; (では16進で）<br />
<span style="color: #00ff00;">Input number&#8230;</span><br />
<span style="color: #00ff00;"> &amp;hFE</span><br />
<span style="color: #00ff00;"> int.Parse failed.</span><br />
<span style="color: #00ff00;"> Convert.ToInt32 failed.</span><br />
<span style="color: #00ff00;"> Ctype : 254</span><br />
<span style="color: #00ff00;"> Hit any key&#8230;</span></p>
<p>CTypeは地域ロケールに依存しつつも、出来る限り変換しようと試みるようです。これが良い場合もあれば悪い場合もあるでしょう。</p>
<p>さらに、もう一歩突っ込んで、Convert.ToInt32 と int.Parse の違いを見てみましょう。<br />
Convert の方は、IFormatProvider を引数に取ることができます。<br />
Parse も IFormatProviderを引数に取ることができますが、NumberStyles列挙体も引数に取ることができます。例えば円記号とカンマ区切りを許容したいのであれば、</p>
<pre name="code" class="vb">
Dim intCastResult As Integer = Integer.Parse(strOriginal, Globalization.NumberStyles.AllowThousands Or Globalization.NumberStyles.AllowCurrencySymbol)
</pre>
<p>と書けることになります。<br />
が、やはりこれも地域ロケールに依存します。<br />
ロケールに依存させたくないというのであれば、最後はIFormatProviderということになるでしょう。</p>
<p>参考：<br />
<a href="http://msdn.microsoft.com/ja-jp/library/tz4z025a.aspx" title="Int.Parse" target="_blank">Int.Parse  (MSDN)</a><br />
<a href="http://msdn.microsoft.com/ja-jp/library/813w40de.aspx" title="Convert.ToInt32" target="_blank">Convert.ToInt32  (MSDN)</a><br />
<a href="http://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&#038;l=JA-JP&#038;k=k%28VB.CTYPE%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK%2cVERSION%3dV4.0%22%29;k%28DevLang-VB%29&#038;rd=true" title="CType 関数" target="_blank">CType 関数 (MSDN)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tk-engineering.com/2011/12/11/%e6%96%87%e5%ad%97%e5%88%97%e3%81%ae%e6%95%b0%e5%80%a4%e5%a4%89%e6%8f%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

