Current section
Files
Jump to
Current section
Files
lib/dicom/character_set/tables.ex
defmodule Dicom.CharacterSet.Tables do
@moduledoc false
# ISO 8859-{2..9} and JIS X 0201 byte ā Unicode codepoint lookup tables.
# Only the 0xA0-0xFF range entries that differ from identity mapping are listed.
# Each map: byte (0xA0..0xFF) => Unicode codepoint.
# ISO 8859-2 (Latin-2, Central European)
@iso8859_2 %{
0xA1 => 0x0104,
0xA2 => 0x02D8,
0xA3 => 0x0141,
0xA5 => 0x013D,
0xA6 => 0x015A,
0xAA => 0x015E,
0xAB => 0x0164,
0xAC => 0x0179,
0xAE => 0x017D,
0xAF => 0x017B,
0xB1 => 0x0105,
0xB2 => 0x02DB,
0xB3 => 0x0142,
0xB5 => 0x013E,
0xB6 => 0x015B,
0xB7 => 0x02C7,
0xBA => 0x015F,
0xBB => 0x0165,
0xBC => 0x017A,
0xBD => 0x02DD,
0xBE => 0x017E,
0xBF => 0x017C,
0xC0 => 0x0154,
0xC3 => 0x0102,
0xC5 => 0x0139,
0xC6 => 0x0106,
0xC8 => 0x010C,
0xCA => 0x0118,
0xCC => 0x011A,
0xCF => 0x010E,
0xD0 => 0x0110,
0xD1 => 0x0143,
0xD2 => 0x0147,
0xD5 => 0x0150,
0xD8 => 0x0158,
0xD9 => 0x016E,
0xDB => 0x0170,
0xDE => 0x0162,
0xE0 => 0x0155,
0xE3 => 0x0103,
0xE5 => 0x013A,
0xE6 => 0x0107,
0xE8 => 0x010D,
0xEA => 0x0119,
0xEC => 0x011B,
0xEF => 0x010F,
0xF0 => 0x0111,
0xF1 => 0x0144,
0xF2 => 0x0148,
0xF5 => 0x0151,
0xF8 => 0x0159,
0xF9 => 0x016F,
0xFB => 0x0171,
0xFE => 0x0163,
0xFF => 0x02D9
}
# ISO 8859-3 (Latin-3, South European)
@iso8859_3 %{
0xA1 => 0x0126,
0xA2 => 0x02D8,
0xA6 => 0x0124,
0xA9 => 0x0130,
0xAB => 0x011E,
0xAC => 0x0134,
0xAF => 0x017B,
0xB1 => 0x0127,
0xB6 => 0x0125,
0xB9 => 0x0131,
0xBB => 0x011F,
0xBC => 0x0135,
0xBF => 0x017C,
0xC5 => 0x010A,
0xC6 => 0x0108,
0xD5 => 0x0120,
0xD8 => 0x011C,
0xDD => 0x016C,
0xDE => 0x015C,
0xE5 => 0x010B,
0xE6 => 0x0109,
0xF5 => 0x0121,
0xF8 => 0x011D,
0xFD => 0x016D,
0xFE => 0x015D,
0xFF => 0x02D9
}
# ISO 8859-4 (Latin-4, North European)
@iso8859_4 %{
0xA1 => 0x0104,
0xA2 => 0x0138,
0xA3 => 0x0156,
0xA5 => 0x0128,
0xA6 => 0x013B,
0xA9 => 0x0160,
0xAA => 0x0112,
0xAB => 0x0122,
0xAC => 0x0166,
0xAE => 0x017D,
0xB1 => 0x0105,
0xB2 => 0x02DB,
0xB3 => 0x0157,
0xB5 => 0x0129,
0xB6 => 0x013C,
0xB7 => 0x02C7,
0xB9 => 0x0161,
0xBA => 0x0113,
0xBB => 0x0123,
0xBC => 0x0167,
0xBD => 0x014A,
0xBE => 0x017E,
0xBF => 0x014B,
0xC0 => 0x0100,
0xC7 => 0x012E,
0xC8 => 0x010C,
0xCA => 0x0118,
0xCC => 0x0116,
0xCF => 0x012A,
0xD0 => 0x0110,
0xD1 => 0x0145,
0xD2 => 0x014C,
0xD3 => 0x0136,
0xD9 => 0x0172,
0xDD => 0x0168,
0xDE => 0x016A,
0xE0 => 0x0101,
0xE7 => 0x012F,
0xE8 => 0x010D,
0xEA => 0x0119,
0xEC => 0x0117,
0xEF => 0x012B,
0xF0 => 0x0111,
0xF1 => 0x0146,
0xF2 => 0x014D,
0xF3 => 0x0137,
0xF9 => 0x0173,
0xFD => 0x0169,
0xFE => 0x016B,
0xFF => 0x02D9
}
# ISO 8859-5 (Cyrillic) ā 0xA0-0xFF maps to U+00A0, U+0401-U+045F
@iso8859_5 (for byte <- 0xA1..0xFF, into: %{} do
codepoint =
case byte do
0xA0 -> 0x00A0
0xAD -> 0x00AD
0xF0 -> 0x2116
0xFD -> 0x00A7
0xFE -> 0x045E
0xFF -> 0x045F
b when b in 0xA1..0xAC -> 0x0401 + (b - 0xA1)
b when b in 0xAE..0xEF -> 0x040E + (b - 0xAE)
b when b in 0xF1..0xFC -> 0x0451 + (b - 0xF1)
_ -> byte
end
{byte, codepoint}
end)
# ISO 8859-6 (Arabic)
@iso8859_6 %{
0xAC => 0x060C,
0xBB => 0x061B,
0xBF => 0x061F,
0xC1 => 0x0621,
0xC2 => 0x0622,
0xC3 => 0x0623,
0xC4 => 0x0624,
0xC5 => 0x0625,
0xC6 => 0x0626,
0xC7 => 0x0627,
0xC8 => 0x0628,
0xC9 => 0x0629,
0xCA => 0x062A,
0xCB => 0x062B,
0xCC => 0x062C,
0xCD => 0x062D,
0xCE => 0x062E,
0xCF => 0x062F,
0xD0 => 0x0630,
0xD1 => 0x0631,
0xD2 => 0x0632,
0xD3 => 0x0633,
0xD4 => 0x0634,
0xD5 => 0x0635,
0xD6 => 0x0636,
0xD7 => 0x0637,
0xD8 => 0x0638,
0xD9 => 0x0639,
0xDA => 0x063A,
0xE0 => 0x0640,
0xE1 => 0x0641,
0xE2 => 0x0642,
0xE3 => 0x0643,
0xE4 => 0x0644,
0xE5 => 0x0645,
0xE6 => 0x0646,
0xE7 => 0x0647,
0xE8 => 0x0648,
0xE9 => 0x0649,
0xEA => 0x064A,
0xEB => 0x064B,
0xEC => 0x064C,
0xED => 0x064D,
0xEE => 0x064E,
0xEF => 0x064F,
0xF0 => 0x0650,
0xF1 => 0x0651,
0xF2 => 0x0652
}
# ISO 8859-7 (Greek)
@iso8859_7 %{
0xA1 => 0x2018,
0xA2 => 0x2019,
0xA4 => 0x20AC,
0xA5 => 0x20AF,
0xAA => 0x037A,
0xAF => 0x2015,
0xB4 => 0x0384,
0xB5 => 0x0385,
0xB6 => 0x0386,
0xB8 => 0x0388,
0xB9 => 0x0389,
0xBA => 0x038A,
0xBC => 0x038C,
0xBE => 0x038E,
0xBF => 0x038F,
0xC0 => 0x0390,
0xC1 => 0x0391,
0xC2 => 0x0392,
0xC3 => 0x0393,
0xC4 => 0x0394,
0xC5 => 0x0395,
0xC6 => 0x0396,
0xC7 => 0x0397,
0xC8 => 0x0398,
0xC9 => 0x0399,
0xCA => 0x039A,
0xCB => 0x039B,
0xCC => 0x039C,
0xCD => 0x039D,
0xCE => 0x039E,
0xCF => 0x039F,
0xD0 => 0x03A0,
0xD1 => 0x03A1,
0xD3 => 0x03A3,
0xD4 => 0x03A4,
0xD5 => 0x03A5,
0xD6 => 0x03A6,
0xD7 => 0x03A7,
0xD8 => 0x03A8,
0xD9 => 0x03A9,
0xDA => 0x03AA,
0xDB => 0x03AB,
0xDC => 0x03AC,
0xDD => 0x03AD,
0xDE => 0x03AE,
0xDF => 0x03AF,
0xE0 => 0x03B0,
0xE1 => 0x03B1,
0xE2 => 0x03B2,
0xE3 => 0x03B3,
0xE4 => 0x03B4,
0xE5 => 0x03B5,
0xE6 => 0x03B6,
0xE7 => 0x03B7,
0xE8 => 0x03B8,
0xE9 => 0x03B9,
0xEA => 0x03BA,
0xEB => 0x03BB,
0xEC => 0x03BC,
0xED => 0x03BD,
0xEE => 0x03BE,
0xEF => 0x03BF,
0xF0 => 0x03C0,
0xF1 => 0x03C1,
0xF2 => 0x03C2,
0xF3 => 0x03C3,
0xF4 => 0x03C4,
0xF5 => 0x03C5,
0xF6 => 0x03C6,
0xF7 => 0x03C7,
0xF8 => 0x03C8,
0xF9 => 0x03C9,
0xFA => 0x03CA,
0xFB => 0x03CB,
0xFC => 0x03CC,
0xFD => 0x03CD,
0xFE => 0x03CE
}
# ISO 8859-8 (Hebrew) ā most positions undefined except Hebrew letters
@iso8859_8 %{
0xAA => 0x00D7,
0xBA => 0x00F7,
0xDF => 0x2017,
0xE0 => 0x05D0,
0xE1 => 0x05D1,
0xE2 => 0x05D2,
0xE3 => 0x05D3,
0xE4 => 0x05D4,
0xE5 => 0x05D5,
0xE6 => 0x05D6,
0xE7 => 0x05D7,
0xE8 => 0x05D8,
0xE9 => 0x05D9,
0xEA => 0x05DA,
0xEB => 0x05DB,
0xEC => 0x05DC,
0xED => 0x05DD,
0xEE => 0x05DE,
0xEF => 0x05DF,
0xF0 => 0x05E0,
0xF1 => 0x05E1,
0xF2 => 0x05E2,
0xF3 => 0x05E3,
0xF4 => 0x05E4,
0xF5 => 0x05E5,
0xF6 => 0x05E6,
0xF7 => 0x05E7,
0xF8 => 0x05E8,
0xF9 => 0x05E9,
0xFA => 0x05EA
}
# ISO 8859-9 (Latin-5, Turkish) ā same as 8859-1 except 6 positions
@iso8859_9 %{
0xD0 => 0x011E,
0xDD => 0x0130,
0xDE => 0x015E,
0xF0 => 0x011F,
0xFD => 0x0131,
0xFE => 0x015F
}
# JIS X 0201 ā Roman part differs at 0x5C (Yen) and 0x7E (overline)
# Katakana half-width: 0xA1-0xDF ā U+FF61-U+FF9F
@doc false
@spec lookup(byte(), non_neg_integer()) :: non_neg_integer()
def lookup(byte, n)
# ISO 8859-2
def lookup(byte, 2), do: Map.get(@iso8859_2, byte, byte)
# ISO 8859-3
def lookup(byte, 3), do: Map.get(@iso8859_3, byte, byte)
# ISO 8859-4
def lookup(byte, 4), do: Map.get(@iso8859_4, byte, byte)
# ISO 8859-5
def lookup(byte, 5), do: Map.get(@iso8859_5, byte, byte)
# ISO 8859-6
def lookup(byte, 6), do: Map.get(@iso8859_6, byte, byte)
# ISO 8859-7
def lookup(byte, 7), do: Map.get(@iso8859_7, byte, byte)
# ISO 8859-8
def lookup(byte, 8), do: Map.get(@iso8859_8, byte, byte)
# ISO 8859-9
def lookup(byte, 9), do: Map.get(@iso8859_9, byte, byte)
@doc false
@spec jis_x0201(byte()) :: non_neg_integer()
def jis_x0201(0x5C), do: 0x00A5
def jis_x0201(0x7E), do: 0x203E
def jis_x0201(byte) when byte >= 0xA1 and byte <= 0xDF, do: 0xFF61 + (byte - 0xA1)
def jis_x0201(byte) when byte <= 0x7F, do: byte
def jis_x0201(byte), do: byte
end