0

我有一个使用 Windows 1252 代码页(从 SQL Server 2008 varchar 字段输入)读取数据的进程。然后我将此数据写入一个平面文本文件,该文件由使用 EBCDIC 37 代码页的 IBM 大型机系统获取。该系统将文件转换为其自己的字符集。但是,扩展 ASCII 范围内的某些内容(字符代码 128 - 255)不会被大型机很好地转换。我认为这是因为 Windows 字符集中的某些字符在 EBCDIC 字符集中不存在。

有没有一种通用的方法来确定我需要过滤掉哪些字符,例如左单引号、右单引号、左双引号、右双引号、项目符号、短划线和短划线,(Windows 代码 145 - 151,分别),仅举几例?如果是这样,是否有一些算法可以用来确定最接近的 EBCDIC 等价物可能是什么(例如左单引号或右单引号的普通单引号)?

4

1 回答 1

1

我一直在寻找解决此问题的通用方法,而不是只关注 EBCDIC 37,并且我不想直观地比较两个代码图表。我编写了一个简短的程序(在 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 回答