tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルゴミデータの検知と制御について
記事No11764
投稿日: 2016/12/12(Mon) 10:02
投稿者SUZUKI
以前NO.11677のTRIM関数の制御について
と関連するのですが、完全には理解出来ておりませんでした
はずかしい限りです

教わったコードは
        If LW.MOJI IsNot Nothing Then
            Dim length As Integer = LW.MOJI.Length
                Debug.WriteLine("Length=" & CStr(length))
            For Each C As Char In LW.MOJI.ToCharArray
                    Debug.WriteLine(AscW(C).ToString("X"))
                Next
        End If

で表示されたのは
Length=5
0
0
0
0
0

でした 前はゴミデータだと変に納得したのですが、
また、おかしくなりほんとうは理解していないのわかりました

1.このデータは何なのか、ヌルコードなのか?
  それならnothingではじかれるはず?

2.select trim(lw.MOJI)
    case "xxxxx"

    case ""

    case else

    end select

でelse前に検知、制御したいのですがselect文にどう修正加えたらよいか悩んでしまいました
よろしくお願いします

[ツリー表示へ]
タイトルRe: ゴミデータの検知と制御について
記事No11765
投稿日: 2016/12/12(Mon) 10:57
投稿者Hongliang
> 1.このデータは何なのか、ヌルコードなのか?
>   それならnothingではじかれるはず?

文字コード0の文字、Unicode的に表現するとU+0000という文字が、5文字含まれたStringオブジェクトです。
ASCIIコードの時代から、0〜31の文字コードには制御コードという、自然言語的には文字とは言えないような文字を当てはめていました。Unicodeでもそれらは引き継がれています。
文字コード0は、C言語などの文字列に特別な型を使用しない言語などにおいて、ここが文字列の終わりであることを示す「終端文字」という役割が割り当てられています。
VBでは文字列には文字列型が存在しており終端文字が無くとも文字列を表現できるので、文字コード0の文字もただの文字です。
// 一般的なフォントにおいてはグリフが割り当てられていないので、不可視だったり、表示機構によっては代替文字に置き換えられて表示されたりします。

> 2.select trim(lw.MOJI)
>     case "xxxxx"
>  
>     case ""
>
>     case else
>
>     end select
>
> でelse前に検知、制御したいのですがselect文にどう修正加えたらよいか悩んでしまいました

hhttps://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.strings.trim.aspx
上のページの記述通り、Trim関数は文字列前後の空白を削除する関数です。
文字コード0の文字は空白を意味する文字コード32の文字ではないので、この関数で削除することはできません。
前後の特定の文字を消すのであれば、Stringオブジェクトに用意されているTrimメソッドを使用します。
Dim trimmed As String = lw.MOJI.Trim(ChrW(0))
// 前の部分だけ消すTrimStartメソッド、後ろの部分だけ消すTrimEndメソッドもあります。
ちなみに、Trimメソッドによって全ての文字が消された場合、長さ0のStringオブジェクト、つまり「""」、空文字列になります。

文中に含まれているのも削除する必要があるなら、StringオブジェクトのReplaceメソッドを使用することになるでしょう。

[ツリー表示へ]
タイトルRe^2: ゴミデータの検知と制御について
記事No11766
投稿日: 2016/12/12(Mon) 11:35
投稿者SUZUKI
Hongliangさん早速の回答ありがとうございます
ようやく、検知対応が出来ました
ありがとうございます

もう少し、教えてください
”文字コード0の文字”という事ですが
これはヌルコードと言わないのでしょうか
”文字コード0の文字”という表現初めてです

nothing
isdbnull
String.IsNullOrEmpty
など色々試していました

引っ掛からないのでヌルコードで無いと
思いますが、違いがわからなくなって来ました 

[ツリー表示へ]
タイトルRe^3: ゴミデータの検知と制御について
記事No11767
投稿日: 2016/12/12(Mon) 12:08
投稿者Hongliang
> ”文字コード0の文字”という事ですが
> これはヌルコードと言わないのでしょうか
> ”文字コード0の文字”という表現初めてです

「文字コード0の文字」は、文字コードが0である文字、という程度の意味で、特に固有の表現というわけではないです。
ヌルコードとも表現するらしいですね。他にヌル文字、終端文字など。
ただ、この文脈で使うヌルはドイツ語本来の0の意味で、C#/VBで使用されるnull/Nothingとは別物です。
ヌルコードはつまり、(文字)コードが0ってことです。
C#/VBとその背景にある.NETではnullを他の意味で使用するので、U+0000に対してヌルどうこうは余り使わない印象があります。いや、そもそもU+0000の出番はほぼ無いので使う機会自体がないのですが。

> nothing

Nothingはオブジェクト自体が存在していない状態です。
空文字列でもStringオブジェクト自体は存在しているのでNothingではありません。
ましてや文字が5つも存在しているのですから、Nothingではあり得ませんよね。その5文字の文字コードがそれぞれいくつであるかはここでは問題ではありません。

> isdbnull

これはDBを扱う文脈で使用されるものです。
通常のオブジェクト操作で出現することはまずありません。

> String.IsNullOrEmpty

このメソッド名に含まれるNullは、.NETにおけるnullであり、VBではNothingと表現されるものです。
つまり、オブジェクトが存在しているかどうかです。
Empty(empty string)は空文字、つまり長さ0の文字列であるかどうかです。
文字5つも存在しているので、Null(Nothing)ではありませんし空文字列でもありません。

[ツリー表示へ]
タイトルRe^4: ゴミデータの検知と制御について
記事No11768
投稿日: 2016/12/12(Mon) 15:10
投稿者SUZUKI
詳細な説明ありがとうございます
ようやく原因らしきものが判明しました
LW.MIJIはテキストBOXからデータを得ています

LW.MOJI = TRIM(TEXT1.TEXT)

これをデータベースの項目に入れる時

Drs.Fields("文字項目1").Value = Mid(LW.MOJI, 1, 5)

としたのが原因のようです

本来はTEXT1.TEXTに何も入れない時
ヌルかスペースで合って欲しいのですが
6文字以上を入れると更新できないというエラーを
防ぐためにMID関数を使ったのですが
これが悪さしていた見たいです

取り除く方法を教えてもらい、また詳細な説明もしてもらいありがとうございました

[ツリー表示へ]