0

Windows 1252 コードページ (SQL Server 2008 varchar フィールドからの入力) を使用してデータを読み取るプロセスがあります。次に、このデータをフラット テキスト ファイルに書き込みます。このファイルは、EBCDIC 37 コードページを使用する IBM メインフレーム システムによって取得されます。そのシステムは、ファイルを独自の文字セットに変換します。ただし、拡張 ASCII 範囲 (文字コード 128 ~ 255) の一部は、メインフレームによって適切に変換されません。これは、Windows 文字セットの特定の文字が EBCDIC 文字セットに存在しないためだと思います。

左一重引用符、右一重引用符、左二重引用符、右二重引用符、箇条書き、en ダッシュ、em ダッシュなど、除外する必要がある文字を特定する一般的な方法はありますか (Windows コード 145 - 151、それぞれ)、いくつか例を挙げると?もしそうなら、最も近いEBCDICの同等物が何であるかを判断するために使用できるアルゴリズムはありますか(左の単一引用符または右の単一引用符の通常の単一引用符など)?

4

1 に答える 1

1

私は、EBCDIC 37 だけに焦点を当てるのではなく、この問題を解決する一般的な方法を探していましたが、コードの 2 つのチャートを視覚的に比較したくありませんでした。あるコードページに存在し、他のコードページには存在しないすべての文字を検索する短いプログラムを (VB.NET で) 作成しました。

' Pick source and target codepages.
Dim sourceEncoding As Encoding = Encoding.Default ' This is Windows 1252 on Windows OS.
Dim targetEncoding As Encoding = Encoding.GetEncoding("IBM037")

' Get every character in the codepage.
Dim inbytes(256) As Byte
For code As Integer = 0 To 255
    inbytes(code) = Convert.ToByte(code)
Next

' Convert the bytes from the source encoding to the target, then back again.
' Those bytes that convert back to the original value exist in both codepages.
' The bytes that change do not exist in the target encoding.
Dim input As String = sourceEncoding.GetString(inbytes)
Dim outbytes As Byte() = Encoding.Convert(sourceEncoding, targetEncoding, inbytes)
Dim convertedbytes As Byte() = Encoding.Convert(targetEncoding, sourceEncoding, outbytes)
Dim output As String = sourceEncoding.GetString(convertedbytes)
Dim diffs As New List(Of Char)()
For idx As Integer = 0 To input.Length - 1
    If input(idx) <> output(idx) Then
        diffs.Add(input(idx))
    End If
Next

' Print results.
Console.WriteLine("Source: " + input)
Console.WriteLine("(Coded): " + String.Join(" ", inbytes.Select(Function (x) Convert.ToInt32(x).ToString()).ToArray()))
Console.WriteLine()
Console.WriteLine("Target: " + output)
Console.WriteLine("(Coded): " + String.Join(" ", convertedbytes.Select(Function (x) Convert.ToInt32(x).ToString()).ToArray()))
Console.WriteLine()
Console.WriteLine("Cannot convert: " + String.Join(" ", diffs.Select(Function (x) Convert.ToInt32(x).ToString()).ToArray()))

Windows 1252 から EBCDIC 37 の場合、マップされない文字が 27 文字あります。それらのキャラクターに最も適していると思うものを選びました。

于 2012-11-16T20:42:09.177 に答える