最近更新したページ
2013-10-20
2013-09-29
2013-09-23
2012-01-07
2011-11-09
2011-10-23
2011-10-09
2011-10-01
2011-09-29
2011-09-03
2011-08-07
2011-08-02
2011-07-29
2011-07-10
2011-05-05
2011-05-04
2011-04-24
2011-04-13
2011-04-05
2011-03-26
2011-02-18
2011-02-15
2010-12-26
2010-12-07
2010-12-05
2010-11-23
2010-09-28
2010-09-23
2010-08-26
2010-08-22
2010-07-16
2010-01-17
2010-01-11
2009-10-04
2009-08-21
2009-08-13
2009-06-18
2009-06-01
2009-04-29
2009-02-16
2009-02-11
2009-02-03
2008-07-22
2008-07-21
2008-07-15
2008-07-14
2008-07-13
2008-07-12
2008-07-08
2008-07-05
2008-06-28
2008-06-17
2008-06-05
2008-06-02
2008-06-01
2008-05-29
2008-05-26
2008-05-21
2008-05-19
2008-05-18
2007-10-31
2007-10-27
2007-09-28
2007-09-23
2007-09-17
2007-09-16
2007-09-14
2007-09-11
2007-06-18
2007-04-15
2006-12-21
2006-11-30
2006-11-22
2006-08-17
2006-03-29
2006-03-28
2006-03-27

utf-8エンコーディング

utf-8エンコーディング

VB2005でエンコードする他、JavaScriptでのコーディングサンプルも(将来)載せたいのでVB2005のページとはしませんでした。

ここでいうところのutf-8エンコーディングと言うのは、よく検索エンジンとかで勝手に変換される"%"付き記号文字列への変換であり、Shift_JIS,EUC-JP,UTF-16,EBCDIC,ASCIIなどの一般的コード体系の相互変換とは違うと思われるのでご留意ください。勉強不足(…というより把握しようと言う気力が無い…)のため内容が混乱していると思います。

追記:ここで言うところのエンコーディングは、「URLエンコード」と呼ばれるものの事のようです。

また、UTF-8などでサポートしてるんだかしてないんだかわからない文字を入力しても、値を返してくるのでご注意ください。

例:イ箸・・・%e2%91%a4 と返してきます。グーグルで検索してもこのコードが返るのでこれで良しと考えてますが、厳密に正しいのか把握している訳ではない。

このページも個人的なメモ書き(覚え書き)です。

※最近カウンタ付けたら予想外にアクセスあることに気づき、言い訳しながら書いている…(^_^;)

VB2005でUTF-8エンコーディングする。

とりあえず今使っているUTF-8へ変換する関数を載せています。調べまくってようやく納得行く動作になっていますが、UTF-8に準拠してるかどうかなんて難しい事はわかりません。結果オーライ(期待した文字列を返してくれている)と言った程度のレベル(要するに覚え書きです)ですが・・・

Private Function utf8encoding( _
                 ByVal encodingText As String) As String
  Dim utf8 As New UTF8Encoding()
  Dim encodedBytes As Byte() = utf8.GetBytes(encodingText)
  Dim encodedString As String = ""  '戻り値格納用
  Dim b As Byte                     '変換前1byte格納用
  Dim bString As String             'UTF8変換済み文字格納用
  '▼ascll文字のutf8処理分岐とutf8エンコード
  For Each b In encodedBytes
    If b = &H20& Then
      '//例外変換:半角スペースを "+"へ変換
      bString = "+"
    ElseIf   ( b >= &H30& And b <= &H39& ) _
          Or ( b >= &H41& And b <= &H5A& ) _
          Or ( b >= &H61& And b <= &H7A& ) _
          Or b = &H5F& Or b = &H2D& Or b = &H2E& Then
      '//変換対象外の処理
      bString = Chr( b )
    Else
      '//変換対象を処理
      bString = "%" & b.ToString("x2")
    End If
    encodedString &= bString
  Next b
  Return encodedString
End Function
※見やすく一部修正(動作未確認状態)。encodingText へ日本語、アルファベットなどを含む文字列を渡すと、戻り値としてUTF-8符号化された文字列を返します。正常に値を返してるようですがこんなんでいいかは不明です。(エンコードとかでコードとか、理屈が難しいので「結果オーライ!」程度のプログラムです。でも、UTF8は、日本語などはShift-JISなどと比較するとデータ量が増大する事。文字コードは UTF-8 や 16 へ統一の方向へ向かっている事。EUCがUNIX系専用の文字コードであること。WindowsVistaには、問題の旧システムと相容れない漢字コードを組み込んでいるらしい事など…違うとこで見たのかも知れないが…その他いろいろ。
※単純にUTF-8符号化するだけなら、インターネット上に変換機能を提供しているサイトが幾つか有ります。

例:UTF-8利用時の例(冗長性もチェックしてみました)
  • 入力文字列:
    • UTF-8 エンコード
      単純に数えて 16Byte = 6Byte + 5(全角文字) * 2Byte
  • 出力文字列:
    • UTF-8+%e3%82%a8%e3%83%b3%e3%82%b3%e3%83%bc%e3%83%89
      単純に数えて 51Byte = 6Byte + 5(全角文字) * 3Character * 3Byte

■一寸やそっとの増え方じゃないのがわかりますか?


▲上へ


■テスト版原文
※折り返ししないと収まらないのでやっぱり一寸修正あり。
ちなみに以下はインポートの一覧
Imports System
Imports System.Text
Imports Microsoft.VisualBasic.Strings
(他のシステム内組み込みなので関連性については忘れた…)

'*******************************************
'utf8エンコードテスト専用
'  textbox1 = エンコードしたい文字列入力用
'  textbox2 = エンコードした文字列を出力
'*******************************************
Private Sub Button1_Click( _
            ByVal sender As System.Object, _
            ByVal e As System.EventArgs) _ 
            Handles Button2.Click
  TextBox2.Text = utf8encoding(TextBox1.Text)
End Sub
'*******************************************
'utfエンコード関数
'  encodingText へエンコードしたい文字列を代入
'  encodedString でエンコード済み文字列を返す
'*******************************************
Private Function utf8encoding( _
                 ByVal encodingText As String) As String
  Dim utf8 As New UTF8Encoding()
  Dim unicodeString As String = encodingText
  Dim encodedBytes As Byte() = utf8.GetBytes(unicodeString)
  Dim encodedString As String = ""
  Dim b As Byte
  Dim bString As String
  '▼ascll文字のutf8処理分岐と
  '    utf8エンコード(文字列の符号化/変換)実行
  For Each b In encodedBytes
    If b = &H20& Then
      '//例外変換:[ ]%20 半角スペースは "+"へ変換する
      bString = "+"
    ElseIf ( b >= &H30& And b <= &H39& )
           Or (b >= &H41& And b <= &H5A& )
           Or (b >= &H61& And b <= &H7A& ) _
           Or b = &H5F& Or b = &H2D& Or b = &H2E& Then
      '//変換対象外:[0-9],[A-Z],[-.],[_],[a-z]
      bString = Chr( b )
    Else
      '//変換対象:
      '//{[!"#$%&'()*+,-./]%21-%2f,[:;<=>?@]%3a-%40,
      '//[[\]^]%5b-%5e,[`]%60,[{|}~]%7b-%7e}
      bString = "%" & b.ToString("x2")
      'Console.Write("%{0:x2}", b)
    End If
    Console.Write(bString)
    encodedString &= bString
  Next b
  Console.WriteLine()
  Console.WriteLine(encodedString)
  Return encodedString
End Function
※単純に言えば、入力文字列を1Byte単位で切り出し"%"+16進表記としているだけ。
※上記動作確認済みコードを修正する必要がでたので覚え書きとして記載。
作成は約1月以上前でMSDNのエンコードを参考に作成。ネット上にも参考となるプログラムがあったが、構造が難しすぎて理解できなかったため自前で作成。本来のutf-8仕様(これがやたらメンドイ)と違う(動けばいい程度[注1])ので注意。

[注1] 「 (ーー;) … すべてそんなもんか? …」 っとふと気づく。



 ♪飾りじゃないのよ涙はぁ、ハッハァー


                 ・・・動きゃいいんだよ。ぶつぶつぶつ。。。(-_-メ)


▲上へ


目的(覚え書き)


目的
本来はWebサービス利用時…と言いたいところですが、vb2005自体がutf8なので必要ない。また、通常ブラウザへ直接RESTリクエスト入力すると勝手にUTF8変換掛るようなのでこれも必要性を感じた事が無い…しかし、とある目的でキーワードなどを日本語のまま使用できない場合があって変換テーブル(CSVファイル)をわざわざ作成し、利用時にこのファイルを配列に読み込み使用していたが、キーワードが増えれば当然変換テーブルへ追加しとかないと正常動作しない。コレガめんどくさいので解決策をあれこれ考えた結果UTF-8エンコしてしまえっ!という感じです。"%"とか"+"どかの記号文字も使用不可だが、特段可逆性なくてもよいので削除してしまえばよく、プログラム動作時に必ず同じ文字列が返るならまったく問題無いといった仕様でOK。

代替案なども考えてはいたが … (^.^)


CSVファイルで変換テーブルを作成する
エクセルなどで簡単に管理できるが…1回だけなら良いが…
CSVファイル作成時に英語の翻訳サイトでキーワード「ガバッ」一括変換、結果を変換テーブルとして作成していた。重複とか、追加管理が必要なため完全自動化は困難であることに気付き、手間隙かかるのでその後放置状態となる。
mdbで変換テーブルを作成管理する
そんな大層なもんじゃないし管理が必要なのはCSVと同じ…
キーワードをローマ字や英文へ自動変換する
やり方わかんないし、変換後同一の文字列が出るとまずい(これは回避可能と思うが、ローマ字変換はともかく、英単語変換など和英辞書でも組み込まないと無理、それ自体で1システムになっちまう!)…

など・・・最終的にUTF-8エンコーディングした符号文字列から使用不可の記号文字を処理すればよいと言う結論。ただし、やたらと文字列が長くなる(UTF-8の冗長性が気になるならUTF-16を使うと良い)のと、目視での可読性が皆無(…これはもうしょうがないって感じ…)であるのが難点。

※UTF-8によるディレクトリトラバーサル?(Wikipediaでも参照してください)なんてのも当然考慮してないです(…当たり前のように…)。なので、セキュリティが要求されるシステムが必要な方は絶対に参考になりません。然るべきサイトで十分に勉強しましょう!


 ・・・ やってみたが ・・・


 挫折!


やっていることは、何ということもなくて、フォルダ名とファイル名を 日本語 -> アルファベット小文字変換してるだけです。しかし、上記のコード変換で例えば、「フォルダ名」合計5文字(10Byte)が45文字(45Byte -> "%"をカットしてしてみるが焼け石に水でダメ。)に増えるという冗長性のため階層が深くなると文字列が長くなりすぎてローカルでも処理しきれなくなるようで、 …

ローカルで動作中にエラー発生。。。(+_+)

… 考えた … ところ、今回作成しているのは、分類コード分けされてるDBデータがソースで、以前のパターンは分類分けが無いキーワードREST検索結果がデータソース。csv変換テーブル作成で問題なく動いてたが、ソースは違えども同じ結果が出たことでしょう。

要するに今回は、分類コードでフォルダ名とファイル名を作ればいいじゃないか!と気づく。

フォルダ名
「"d"+分類コード」
ファイル名
「"f"+分類コード+"_"シリアルNo」

※一応数字でフォルダ名とかファイル名を開始すると、後日またトラブルの元になりそうなので・・・


           やり直し! ・・・ (ーー;) ・・・ シコシコ


※姑息にも、文字数を減らす工夫をしたらエラー回避した。抜本的な解決で無いので…ボツ…ですが。。。
※Console文をすべてコメントアウトしたら、実行ファイルの処理速度が飛躍的に向上した。1処理1秒で19分で考えてたが、Consoleカットでほとんど待たずに終了するようである。デバック用にConsole文を残してビルドをするのは如何!と気づく。
※・・・姑息な手段もやはりエラーが出た。とりあえずカタカナのコードを大幅カットしたが、日本語で長い文字列で再発。UTF-8(UTF-8でも例えばカタカナ開始コードの"%e3"カット"%"カットの他、漢字の開始コードのカットで解決はできるが、この開始コードは1つや2つでないのが問題。)ではなくShift-JISとかUTF-16とかなら解決できそうだが、そもそも可読性の無いフォルダ名、ファイル名に意味は無いので、分類コード置換えとなると思う。ただし、RESTで取得したデータをデータソースとする場合、再度この問題にぶち当たる事にはなると思う・・・


 解決!


結局、UTF-8でのURLエンコーディングせずに、分類コードを利用の仕様に変更し問題解決。


▲上へ


リンク


VisualBasic2005の本

入門向け


入門以上


専門向け(理系・DB・その他)



内部リンク



外部リンク




▲上へ
2007年10月27日(土) 09:39:20 Modified by cafeboy1




スマートフォン版で見る

×

この広告は60日間更新がないwikiに表示されております。