ちょっと面白そうなので前回回答のあと色々と調べていたところ、同じクエリを発行してもクライアントによって結果が異なることに気づきました。
例えば、select '€' chr from dual
というクエリをVB.NETから投げると'?'(半角)が返ってきますが、A5SQLから投げると'?'(全角)が返ってきます。
もしかしたらクライアント依存の部分があるのでは。
そこでVB.NETで全文字1文字ずつselectして試してみました。
以下検証コード。
VBNET
1 Imports Oracle.ManagedDataAccess.Client
2 Public Class Form1
3 Dim ds As New List ( Of EncData )
4 Private Sub Form1_Load ( sender As System . Object , e As System .EventArgs ) Handles MyBase .Load
5 For i = 0 To 55295
6 Try
7 Dim d As New EncData
8 d.codep = i
9 d.orig = Char .ConvertFromUtf32 ( i )
10 ds.Add ( d )
11 Catch ex As Exception
12 End Try
13 Next
14 ora_convert ( ds )
15 to_file ( ds )
16 DataGridView1.DataSource = ds
17 End Sub
18 Private Sub ora_convert ( ByRef lds As List ( Of EncData ) )
19 Dim constr = "User Id=xxxx;Password=xxxx;Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XE)))"
20 Dim conn = New OracleConnection ( constr )
21 conn. Open ( )
22 Dim sql = "select :val from dual"
23 Dim cmd = conn.CreateCommand
24 cmd.Connection = conn
25 cmd.CommandType = CommandType. Text
26 cmd.CommandText = sql
27 lds.ForEach ( Sub ( s )
28 cmd.Parameters. Clear ( )
29 cmd.Parameters.Add ( "val" , s.orig )
30 Dim result = cmd.ExecuteScalar
31 s.convto = result.ToString
32 End Sub )
33 conn. Close ( )
34 conn.Dispose ( )
35 End Sub
36 Private Sub to_file ( ByRef lds As List ( Of EncData ) )
37 Dim fp = My.Computer.FileSystem.OpenTextFileWriter ( "output.txt" , False )
38 For Each item In lds
39 fp . Write ( item.codep )
40 fp . Write ( vbTab )
41 fp . Write ( item.orig )
42 fp . Write ( vbTab )
43 fp . Write ( item.convto )
44 fp . Write ( vbTab )
45 fp . Write ( item.isWideOrSmallQs )
46 fp . Write ( vbTab )
47 fp .WriteLine ( )
48 Next
49 fp . Close ( )
50 fp .Dispose ( )
51 End Sub
52 End Class
53 Public Class EncData
54 Public Property codep As Integer
55 Public Property orig As String
56 Public Property convto As String
57 Public ReadOnly Property isWideOrSmallQs As String
58 Get
59 If IsNothing ( convto ) Then
60 Return "-"
61 ElseIf convto = "?" Then
62 Return "Wide"
63 ElseIf convto = "?" Then
64 Return "Small"
65 Else
66 Return "-"
67 End If
68 End Get
69 End Property
70 End Class
結果は、U2FFF以下かつSJISにエンコードできない文字は半角クエスチョンに、U3000以上は全角クエスチョンになりました。全部試していませんがA5SQLからだとおそらくすべて全角クエスチョンになります。
つまり、変換できない文字がどのように扱われるかは環境依存となり、解決策は実環境で全文字変換してリストを作り、そのリストをもとに個別にどう扱うか検討する必要がある、ということでしょう。
なお、上のコードはOracle.ManagedDataAccessで実行した結果で、クライアント側のドライバが変わると結果が変わる可能性があるので、質問者さんのほうでも個別検証して結果を取得すべきと思います。
8/4 追記を受けて
判定したい目的)
文字化け後の文字がファイル名に使えるかどうか判定したいから
(半角ハテナはファイル名に使用不可、全角は使用可)
という理由なら、本回答で例示した変換表をもって事前変換するか、処理の都度検証コードでも書いたselect :var from dual
をOracle側に投げて変換後の文字列を事前取得。それをもってファイル名のバリデーションをかければいいのではないかと。
前述したとおりクライアントによって変換の仕様が異なるので試しに投げてみるのが一番だと考えます。