def decode(data_element, dicom_character_set): """Apply the DICOM character encoding to the data element data_element -- DataElement instance containing a value to convert dicom_character_set -- the value of Specific Character Set (0008,0005), which may be a single value, a multiple value (code extension), or may also be '' or None. If blank or None, ISO_IR 6 is used. """ if not dicom_character_set: dicom_character_set = ['ISO_IR 6'] encodings = convert_encodings(dicom_character_set) # decode the string value to unicode # PN is special case as may have 3 components with differenct chr sets if data_element.VR == "PN": # logger.warn("%s ... type: %s" %(str(data_element), type(data_element.VR))) if in_py3: if data_element.VM == 1: data_element.value = data_element.value.decode(encodings) else: data_element.value = [ val.decode(encodings) for val in data_element.value ] else: if data_element.VM == 1: data_element.value = PersonNameUnicode(data_element.value, encodings) else: data_element.value = [ PersonNameUnicode(value, encodings) for value in data_element.value ] if data_element.VR in text_VRs: # Remove the first encoding if this is a multi-byte encoding if len(encodings) > 1: del encodings[0] # You can't re-decode unicode (string literals in py3) if data_element.VM == 1: if isinstance(data_element.value, unicode): return data_element.value = clean_escseq( data_element.value.decode(encodings[0]), encodings) else: output = list() for value in data_element.value: if isinstance(value, unicode): output.append(value) else: output.append( clean_escseq(value.decode(encodings[0]), encodings)) data_element.value = output
def decode(data_element, dicom_character_set): """Apply the DICOM character encoding to the data element data_element -- DataElement instance containing a value to convert dicom_character_set -- the value of Specific Character Set (0008,0005), which may be a single value, a multiple value (code extension), or may also be '' or None. If blank or None, ISO_IR 6 is used. """ if not dicom_character_set: dicom_character_set = ['ISO_IR 6'] have_character_set_list = True try: dicom_character_set.append # check if is list-like object except AttributeError: have_character_set_list = False if have_character_set_list: if not dicom_character_set[0]: dicom_character_set[0] = "ISO_IR 6" else: dicom_character_set = [dicom_character_set] encodings = [python_encoding[x] for x in dicom_character_set] if len(encodings) == 1: encodings = [encodings[0]]*3 if len(encodings) == 2: encodings.append(encodings[1]) # decode the string value to unicode # PN is special case as may have 3 components with differenct chr sets if data_element.VR == "PN": # logger.warn("%s ... type: %s" %(str(data_element), type(data_element.VR))) if data_element.VM == 1: data_element.value = PersonNameUnicode(data_element.value, encodings) else: data_element.value = [PersonNameUnicode(value, encodings) for value in data_element.value] if data_element.VR in ['SH', 'LO', 'ST', 'LT', 'UT']: # Remove the first encoding if this is a multi-byte encoding if len(encodings) > 1: del encodings[0] if data_element.VM == 1: data_element.value = clean_escseq( data_element.value.decode( encodings[0]), encodings) else: data_element.value = [clean_escseq( value.decode(encodings[0]), encodings) for value in data_element.value]
def testUnicodeJp(self): """PN: 3component in unicode works (Japanese)............................""" # Example name from PS3.5-2008 section H p. 98 pn = PersonNameUnicode( """Yamada^Tarou=\033$B;3ED\033(B^\033$BB@O:\033(B=\033$B$d$^$@\033(B^\033$B$?$m$&\033(B""", [default_encoding, 'iso2022_jp']) expected = ("Yamada", "Tarou") got = (pn.family_name, pn.given_name) self.assertEqual(got, expected, "PN: Expected single_byte name '{0!s}', got '{1!s}'".format(expected, got))
def testUnicodeKr(self): """PN: 3component in unicode works (Korean)..............................""" # Example name from PS3.5-2008 section I.2 p. 101 pn = PersonNameUnicode( """Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=\033$)C\310\253^\033$)C\261\346\265\277""", [default_encoding, 'euc_kr']) expected = ("Hong", "Gildong") got = (pn.family_name, pn.given_name) self.assertEqual(got, expected, "PN: Expected single_byte name '{0!s}', got '{1!s}'".format(expected, got))
# Copyright (c) 2008-2012 Darcy Mason # This file is part of pydicom, relased under an MIT license. # See the file license.txt included with this distribution, also # available at https://github.com/darcymason/pydicom import Tkinter from dicom.valuerep import PersonNameUnicode default_encoding = 'iso8859' root = Tkinter.Tk() # root.geometry("%dx%d%+d%+d" % (800, 600, 0, 0)) person_names = [ PersonNameUnicode( """Yamada^Tarou=\033$B;3ED\033(B^\033$BB@O:\033(B=\033$B$d$^$@\033(B^\033$B$?$m$&\033(B""", [default_encoding, 'iso2022_jp']), # DICOM standard 2008-PS3.5 H.3 p 98 PersonNameUnicode( """Wang^XiaoDong=\xcd\xf5\x5e\xd0\xa1\xb6\xab=""", [default_encoding, 'GB18030']), # DICOM standard 2008-PS3.5 J.3 p 105 PersonNameUnicode( """Wang^XiaoDong=\xe7\x8e\x8b\x5e\xe5\xb0\x8f\xe6\x9d\xb1=""", [default_encoding, 'UTF-8']), # DICOM standard 2008-PS3.5 J.1 p 104 PersonNameUnicode( """Hong^Gildong=\033$)C\373\363^\033$)C\321\316\324\327=\033$)C\310\253^\033$)C\261\346\265\277""", [default_encoding, 'euc_kr']), # DICOM standard 2008-PS3.5 I.2 p 101 ] for person_name in person_names: label = Tkinter.Label(text=person_name) label.pack() root.mainloop()