-
文字列の一種として、特殊文字の「改行」「タブ」「バックスペース」等をシステム定数として定義されています。
この定義済みの文字列を紹介します。 特殊文字として使うとすれば「復帰」「ラインフィード」「改行」「タブ」「バックスペース」ぐらいでしょうか。
以下の様にシステム定数文字列 vbCr , vbLf , vbNewLine , vbTab , vbBack を使います。 長さが1(復帰のみ2)の文字列として文字列変数にそのまま代入したり連結する形で使えます。 (これらの文字列は Microsoft.VisualBasic.Constants モジュールに定義されています。)
また Microsoft.VisualBasic.ControlChars モジュールにも同じものが定義されていますので、こちらを使うこともできます。
ところで1つはまる点があるのですが、 C# や PHP などではダブルクォテーションで文字列を定義した時に 「¥」円マーク(バックスラッシュ)でエスケープ文字として特殊文字を記述できるので VB.NET でも同じ様に記述すると 単なる「¥」と「n」等の文字そのものになります。■定義済みの文字列定数
Dim str1 As String Dim str2 As String Dim str3 As String '復帰文字 : &H0D str1 = vbCr str2 = ControlChars.Cr str3 = "\r" 'VB.NET では \ はそのままの文字列でエスケープシーケンスではない! Console.WriteLine("vbCr = ControlChars.Cr : " & (str1 = str2) & _ " ControlChars.Cr = ""\r"" : " & (str2 = str3)) 'ラインフィード文字 : &H0A str1 = vbLf str2 = ControlChars.Lf str3 = "\n" Console.WriteLine("vbLf = ControlChars.Lf : " & (str1 = str2) & _ " ControlChars.Lf = ""\n"" : " & (str2 = str3)) '復帰文字とラインフィード文字の組み合わせ : &H0D &H0A str1 = vbCrLf str2 = ControlChars.CrLf str3 = "\r\n" Console.WriteLine("vbCrLf = ControlChars.CrLf : " & (str1 = str2) & _ " ControlChars.CrLf = ""\r\n"" : " & (str2 = str3)) '改行文字(WindowsではvbCrLfと同等) str1 = vbNewLine str2 = ControlChars.NewLine str3 = "\n" Console.WriteLine("vbNewLine = ControlChars.NewLine : " & (str1 = str2) & _ " ControlChars.NewLine = ""\n"" : " & (str2 = str3)) 'タブ文字 : &H9 str1 = vbTab str2 = ControlChars.Tab str3 = "\t" Console.WriteLine("vbTab = ControlChars.Tab : " & (str1 = str2) & _ " ControlChars.Tab = ""\t"" : " & (str2 = str3)) 'バックスペース文字 : &H8 str1 = vbBack str2 = ControlChars.Back str3 = "\t" Console.WriteLine("vbBack = ControlChars.Back : " & (str1 = str2) & _ " ControlChars.Back = ""\b"" : " & (str2 = str3))
上記のソースの部分のみを実行させた場合に、デバッグ出力ウインドウに以下の様に表示されました。
vbCr = ControlChars.Cr : True ControlChars.Cr = "\r" : False vbLf = ControlChars.Lf : True ControlChars.Lf = "\n" : False vbCrLf = ControlChars.CrLf : True ControlChars.CrLf = "\r\n" : False vbNewLine = ControlChars.NewLine : True ControlChars.NewLine = "\n" : False vbTab = ControlChars.Tab : True ControlChars.Tab = "\t" : False vbBack = ControlChars.Back : True ControlChars.Back = "\b" : False
当然なのですが結果から vbCr と ControlChars.Cr は同じであることがわかります。 (他の文字列も同様です)
■定義済みの文字列定数を使う場面について
上記の定義済みの文字列定数を使えば改行等がソース上に視覚的にはっきりとわかる形で記述できます。
ではどの様な時にこれを使う意味が有るのか。 私の場合、改行文字が必要な場面と言えば、 Oracle 等のデータベースへの SQL 文を作成する場合に使用します。 以下のソースでその例をしめします。生成される SQL 文は例なので意味はありません。'接続文字列(これ自身は意味がありません) Dim strConnect As String = "Data Source=//*********/test; User ID=test;Password=test;" 'オラクル接続オブジェクト Dim Conn As New OracleConnection(strConnect) 'オラクル接続オープン Conn.Open() 'SQL文 Dim strSQL As String = "" strSQL &= "SELECT " & vbCrLf strSQL &= " TT.伝票番号, TT.伝票日付" & vbCrLf strSQL &= "FROM 売上伝票 TT" & vbCrLf strSQL &= "WHERE TT.伝票日付 = TO_DATE('2019/11/12')" & vbCrLf strSQL &= "ORDER BY TT.伝票番号" & vbCrLf 'コマンドオブジェクト(SQL文と接続オブジェクト) Dim Cmd As New OracleCommand(SQL, Conn) Cmd.CommandType = CommandType.Text '読込オブジェクトに接続 Dim dr As OracleDataReader = Cmd.ExecuteReader() '*** この後はデータ処理... ***
このソースでは SQL 文を SELECT FROM WHERE ORDER BY の各句で改行を入れています。
この改行ですが Oracle SQL 文の解析を行う時に空白文字の様にホワイトスペースとして扱われ、文字列の中では単語の区切りとみなされます。 そのため、この SQL 文では句の区切りとして使用しています。
改行を入れなくても、先頭に1文字空白を入れれば同じことにはなるのですが、テキストとして見ると改行が入った方が見やすい為です。 (先頭に空白を入れ忘れた時のバカ除けでもあります)
実際システムではよく実行 SQL 文のログを残したりしますが、 その時に長い文字列の1行よりも適当に改行が入っていた方が見やすいのです。
■ダブルクォテーションそのものを文字列の中に定義する方法
ダブルクォテーションそのものを文字列の中に宣言したい場合について説明します。 文字列はダブルクォテーションで囲まれていますが、その文字列の中でダブルクォテーションを2回連続して記述します。 (""として記述)
文字列の中にダブルクォテーションを記述する例として思い当たるのは、 上記のソースの SQL 文の中でカラム名とテーブル名が全角になっていますが、 Oracleではこれらをダブルクォテーションで 囲んだ方が安全です。(昔の Oracle ではある全角文字がうまく判定できないことがありました。)
結果として以下の様な記述になります。'SQL文 Dim strSQL As String = "" strSQL &= "SELECT " & vbCrLf strSQL &= " TT.""伝票番号"", TT.""伝票日付""" & vbCrLf strSQL &= "FROM ""売上伝票"" TT" & vbCrLf strSQL &= "WHERE TT.""伝票日付"" = TO_DATE('2019/11/12')" & vbCrLf strSQL &= "ORDER BY TT.""伝票番号""" & vbCrLf
PR -
文字列データを全角に全て統一したり、または半角に強制的に変換したい場合に使用するのが StrConv 関数です。 この関数は以下の様な宣言になっています。
Public Function StrConv(str As String, Conversion As Microsoft.VisualBasic.VbStrConv, Optional LocaleID As Integer = 0) As String ・str :変換する String 型の式。 ・Conversion:Microsoft.VisualBasic.VbStrConv のメンバー。 実行する比較の種類を指定する列挙値。 ・LocaleID :省略可能です。 システム LocaleID 値と異なる場合の LocaleID 値。 既定値は、システムの LocaleID です。
LocaleID の引数は通常であれば必要はありません。
尚、Conversion の引数は以下の様な種類があります。
Conversion 処理 VbStrConv.Hiragana 文字列内のカタカナをひらがなに変換します。 日本語ロケールのみに適用されます。 VbStrConv.Katakana 文字列内のひらがなをカタカナに変換します。 日本語ロケールのみに適用されます。 VbStrConv.Lowercase 文字列を小文字に変換します。 VbStrConv.Narrow 文字列内の全角文字を半角文字に変換します。 アジア ロケールに適用されます。 VbStrConv.Uppercase 文字列を大文字に変換します。 VbStrConv.Wide 文字列内の半角 (1 バイト) 文字を全角 (2 バイト) 文字に変換します。
アジア ロケールに適用されます。これらの Conversion の値を OR で連結して指定ができます。
上記の例を以下のソースで行います。
文字列変換関数(StrConv)の使用例
' 元の文字列宣言 Dim strOrg As String = "01245ABCDExyzあいうえおカキクケコサシスセソタチツテト" Dim str As String Console.WriteLine("[変換前の文字列] :" & strOrg) ' 大文字を小文字に変換 str = StrConv(strOrg, VbStrConv.Lowercase) Console.WriteLine("[大文字] ⇒[小文字] :" & str) ' 半角文字を全角文字に変換 str = StrConv(strOrg, VbStrConv.Wide) Console.WriteLine("[半角文字]⇒[全角文字]:" & str) ' 全角文字を半角文字に変換 str = StrConv(strOrg, VbStrConv.Narrow) Console.WriteLine("[全角文字]⇒[半角文字]:" & str) ' 文字列内の[カタカナ]を[ひらがな]に変換します str = Strings.StrConv(strOrg, VbStrConv.Hiragana) Console.WriteLine("[カタカナ]⇒[ひらがな]:" & str) ' 文字列内の[ひらがな]を[カタカナ]に変換します str = Strings.StrConv(strOrg, VbStrConv.Katakana) Console.WriteLine("[ひらがな]⇒[カタカナ]:" & str) ' 小文字を大文字に変換後、全角文字に変換 str = StrConv(strOrg, VbStrConv.Uppercase Or VbStrConv.Wide) Console.WriteLine("[大文字]+[全角文字] :" & str)
上記の処理を実行すると以下の様な表示が、「出力」ウインドウに表示されます。[変換前の文字列] :01245ABCDExyzあいうえおカキクケコサシスセソタチツテト [大文字] ⇒[小文字] :01245abcdexyzあいうえおカキクケコサシスセソタチツテト [半角文字]⇒[全角文字]:01245ABCDExyzあいうえおカキクケコサシスセソタチツテト [全角文字]⇒[半角文字]:01245ABCDExyzあいうえおカキクケコサシスセソタチツテト [カタカナ]⇒[ひらがな]:01245ABCDExyzあいうえおかきくけこサシスセソたちつてと [ひらがな]⇒[カタカナ]:01245ABCDExyzアイウエオカキクケコサシスセソタチツテト [大文字]+[全角文字] :01245ABCDEXYZあいうえおカキクケコサシスセソタチツテト
関連する記事
⇒文字列変換関数(StrConv)で変換が途中で切れる
-
文字列変換関数の StrConv を使っていて、変換結果が途中で切れてしまう現象が発生してしまいました。 普通に考えて以下の様な処理を行ったのですが、思った通りの結果が得られずに途中までしか変換されません。
文字列変換関数(StrConv)で変換が途中で切れるソース
Dim strOrg As String = "abcあいうえお" Dim str As String = StrConv(strOrg, VbStrConv.Wide) Debug.WriteLine("全角文字変換:" & str)
上記のソースの部分のみを実行させた場合に、デバッグ出力ウインドウに以下の様に表示されました。
全角文字変換:abcあ
予想変換結果は「abcあいうえお」のはずなのですが、上手く変換されません。 変換種類の第2引数を変えてもうまくいかない場合があります。
そこでネットで調べたのですが Visual Studio が互換モードで実行されていると、 この現象が発生することがわかりました。 早速、自分のPCの Visual Studio の実行ショートカットのプロパティを開いてみました。上図の様に互換性にチェックが入っていたので、互換性のチェックを外して以下の様にしました。
Visual Studio 再度起動しなおして、上記のソースを実行すると、当然のことながら以下の結果が表示されました。
全角文字変換:abcあいうえお
Visual Studio のインストールの時点で互換性をONしていたのかもしれません。今となってはよくわかりませんが。 StrConv の変換がなぜか上手くいかない場合は互換性をチェックしてみて下さい。関連する記事
⇒文字列定数(改行、タブ、バックスペース等)について
⇒文字列変換関数(StrConv)の使い方
-
11月に入るとテレビで年賀状のCMが流れ出します。 今年もこの時期なのかと思います。
私が若いころは家族の近況報告の様な感じで子供の写真の画像を使って印刷をしていましたが、皆さんは如何でしょうか。 家族そろっての写真や、旅行での気に入った景色の前での記念写真などを使ったことを思い出します。
ただ、出す方は良いのですが、もらった方にしてみれば、面識はあるのだが良く知らない人の家族みせれても... な感じではないでしょうか。
良く考えてみて、年賀状って本当に必要なのでしょうか?
最近は、年賀状の裏は印刷で、宛名面もプリンタでの印字というのが大方の様な気がします。
かく言う私も同じことをしていますが、なかなか面倒なのでどうしても裏面は印刷で宛名はプリンタ出力になってしまいます。
私は自営業なのでお客様である会社関係は失礼があってもいけないので、年賀状は必要かなともいます。
ただ、親戚、友達関係は特に重要な人に絞っています。
人間、世間体的なことを考えて、なかなか今までの習慣を止められないものです。
年賀はがきも1枚63円になりましたし、消費税も10%になり印刷代も結構掛かります。 さらに、プリンタで宛名を印刷するにしても時間が掛かります。 年賀状を処理する為にトータルで1日ぐらいは毎年掛かっている様に思います。
なんと言う時間の無駄遣いかと思いますが、止めれれない自分が悪いのです。
ところで年賀状はいつからあるのかと調べてみたら、古くは平安の時代には既にあった様です。 平安時代は貴族の間で年始回りの代わりとして遠方の人に送ったそうです。 その後、時代が下って江戸時代に飛脚制度がととのい書状による賀状があったそうです。
そして明治維新と共に郵便制度が整備されてからは庶民の間でも書状による賀状がありました。 また郵便はがきが登場したことにより簡単に、封書よりは安く送れることからはがきによる賀状のやり取りが増えてきたため 、1905年には年賀郵便制度ができ、12月20日から30日までに郵便局に持ち込まれたものは翌年の1月1日以降に配達するようになりました。
更に戦後の1949年になって現在のお年玉付き年賀状が発行されるようになりました。 現在の年賀状の形になってから70年ですからそんなにも昔では無いのです。
この年賀状の売上ですが郵便事業の約10%を占めているそうです。 10%と言えば大変なもので、1年の売り上げの中でのことですから郵便事業のドル箱的存在です。 (この「ドル箱」という言葉も今では死語?)
年賀状を売るために職員に過剰なノルマを課せた結果、 ノルマ分を自分自身で購入し、金券ショップで安く売るという自爆営業と称することがよく行われる様です。 こんなことをやってまで存続させる意味があるのかと思います。 結局は郵便局にのせれられているのではないかと…
まあこんなことを言っていても年賀状を止められないので、なんとか安く仕上げる方法はないかとしらべてみました。
はがき代金はどうしてもかかるので仕方ないのですが、印刷代金が安く済むところがありました。
以下のサイト「おたより本舗」と言うところです。このサイト全国1位とのことらしく、以下のメリットがあります。
- 印刷代金が最大45%引き
- 年賀はがき代が1枚58円(1枚5円引き)
- 送料が0円(無料)
- 仕上りが早い
良いこと尽くめだったので少し心配でしたが、11月2日依頼で11月4日には到着しました。 印刷の出来上がりも特に問題はありませんでした。 来年からも必要があればここに頼もうかと思います。
以前は「カメラの○○○○」で印刷を頼んでしたのですが、 今回年賀状30枚で料金は1000円前後安くなりました。 (はがき1枚5円引きが結構ききます)
-
FileReader オブジェクトを使うと、ローカルなコンピューター内にある画像ファイルをウェブアプリケーションから非同期的に読み込むことが出来ます。 今回はこの FileReader を使って canvas に画像ファイルを描画する方法について説明します。 尚、画像ファイルの指定は input タグで type="file" とします。
処理の手順は以下の通りです- FileReader を生成画像の描画
- FileReader の readAsDataURL メソッドでファイル読込
- FileReader の onload イベントで canvas への画像表示関数の実行
■FileReaderを使いcanvasに画像ファイルを表示
<html> <head> <meta charset="utf-8"> <title>test ajax</title> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script type="text/javascript"> //Image関数 function drawImage(imageFile) { var canvas = $("#canvas"); var ctx = canvas[0].getContext("2d"); //イメージオブジェクト var img1 = new Image(); //画像ファイル指定でファイル読込開始 img1.src = imageFile; //画像ロード後に画像を描画できる。 img1.onload = function(){ //画像の大きさを設定 width = img1.width; height = img1.height; canvas.attr('width' , width); canvas.attr('height', height); //画像を描画 ctx.drawImage(img1, 0, 0, width, height); } return false; } //ページロード時イベント宣言 $(function() { var file = null; // 選択されるファイル //ファイル選択時イベント宣言 $("input[type=file]").change(function() { //ファイルを取得 file = $(this).prop("files")[0]; //FileReader API var reader = new FileReader(); //ファイルロード終了時イベント宣言 reader.onload = function(e) { //画像表示関数コール drawImage(e.target.result); }; //fileを読込の開始 reader.readAsDataURL(file); }); }); </script> </head> <body> <h2>test canvas</h2> <canvas id="canvas" width="100" height="100" ></canvas> <br /> <input type="file" accept="image/*" /> </body> </html>