私は、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 文字あります。それらのキャラクターに最も適していると思うものを選びました。