# Replacing national characters in the string with ASCII symbols

**URL:** <https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193>\
**Category:** General Discussion\
**Created:** [May 3, 2023, 11:43am UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193 "2023-05-03T11:43:58Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Gediminas\_Labutis](https://avatars.discourse-cdn.com/v4/letter/g/3ec8ea/32.png) [@Gediminas\_Labutis](https://forum.inductiveautomation.com/u/Gediminas_Labutis)\
**Post date:** [May 3, 2023, 11:43am UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/1 "2023-05-03T11:43:58Z")

</div>

We want to display logged in user on machine HMI. User name is retrieved from database and includes national characters. However, HMI accepts only ASCII symbols. How can I replace national symbols in Ignition string type tag with ASCII symbols.

Something like this works in online Python interpreter but not in Ignition script console (the same string containing national characters is returned for output string)

```auto
# create a dictionary with national characters and their ASCII equivalents
translation_dict = {
    'Ą': 'A',
    'ą': 'a',
    'Č': 'C',
    'č': 'c',
    'Ę': 'E',
    'ę': 'e',
    'Ė': 'E',
    'ė': 'e',
    'Į': 'I',
    'į': 'i',
    'Š': 'S',
    'š': 's',
    'Ų': 'U',
    'ų': 'u',
    'Ū': 'U',
    'ū': 'u',
    'Ž': 'Z',
    'ž': 'z'
}

# input string with national characters
#TagPath = "[default]IDBadgeManager/AccessControl/TestString"
#input_string = system.tag.readBlocking(TagPath)[0].value
input_string = "ĄČęėį"

# replace national characters with ASCII symbols using translation_dict
output_string = ''
for sym in input_string:
	
    if sym in translation_dict:
        output_string += translation_dict[sym]
    else:
        output_string += sym

# print output
print(input_string)
print(output_string)

```

---

<div class="post-metadata">

**Author:** ![victordcq](https://avatars.discourse-cdn.com/v4/letter/v/f6c823/32.png) [@victordcq](https://forum.inductiveautomation.com/u/victordcq)\
**Post date:** [May 3, 2023, 12:27pm UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/2 "2023-05-03T12:27:01Z")

</div>

this should probably handle most letters

```auto
	import unicodedata
	newValue = unicodedata.normalize('NFKD', value).encode('ascii', 'ignore')

```

![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/d/ad56f4fa164185d9ebbb8463baf82b8847529987.png)

---

<div class="post-metadata">

**Author:** ![zxcslo](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/zxcslo/32/61610_2.png) [@zxcslo](https://forum.inductiveautomation.com/u/zxcslo)\
**Post date:** [May 3, 2023, 12:27pm UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/3 "2023-05-03T12:27:08Z")

</div>

Maybe [this](https://stackoverflow.com/questions/517923/what-is-the-best-way-to-remove-accents-normalize-in-a-python-unicode-string) can help...

---

<div class="post-metadata">

**Author:** ![JordanCClark](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jordancclark/32/83362_2.png) [@JordanCClark](https://forum.inductiveautomation.com/u/JordanCClark)\
**Post date:** [May 3, 2023, 12:31pm UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/4 "2023-05-03T12:31:49Z")

</div>

EDIT: forget everything I said below, with the exception of unicode being problematic. Use unicodedata  
~~unicodedata seems to have issues. Sample string returns AAAAA.~~

```python
import unicodedata

input_string = unicode("ĄČęėį")

output_string = unicodedata.normalize('NFKD', input_string).encode('ascii', 'ignore')

```

Unidecode require Python 3.5.

Unicode is sometimes... problematic in Jython. Use a _ **u** _ in front of literals, and _**unicode()**_ for assigning.  
This is your code, modified for posterity.

```python
# create a dictionary with national characters and their ASCII equivalents
translation_dict = {
    u'Ą': 'A',
    u'ą': 'a',
    u'Č': 'C',
    u'č': 'c',
    u'Ę': 'E',
    u'ę': 'e',
    u'Ė': 'E',
    u'ė': 'e',
    u'Į': 'I',
    u'į': 'i',
    u'Š': 'S',
    u'š': 's',
    u'Ų': 'U',
    u'ų': 'u',
    u'Ū': 'U',
    u'ū': 'u',
    u'Ž': 'Z',
    u'ž': 'z'
}

# if you need to do multiple lookups, assign the keys to a variable.
keys = translation_dict.keys()

# input string with national characters
#TagPath = "[default]IDBadgeManager/AccessControl/TestString"
#input_string = system.tag.readBlocking(TagPath)[0].value
input_string = unicode("ĄČęėį")

# replace national characters with ASCII symbols using translation_dict
output_string = ''
for sym in input_string:
	
    if sym in keys:
        output_string += translation_dict[sym]
    else:
        output_string += sym

# print output
print(input_string)
print(output_string)

```

---

<div class="post-metadata">

**Author:** ![victordcq](https://avatars.discourse-cdn.com/v4/letter/v/f6c823/32.png) [@victordcq](https://forum.inductiveautomation.com/u/victordcq)\
**Post date:** [May 3, 2023, 12:33pm UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/5 "2023-05-03T12:33:13Z")

</div>

yes you do need the u''

---

<div class="post-metadata">

**Author:** ![JordanCClark](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/jordancclark/32/83362_2.png) [@JordanCClark](https://forum.inductiveautomation.com/u/JordanCClark)\
**Post date:** [May 3, 2023, 12:34pm UTC](https://forum.inductiveautomation.com/t/replacing-national-characters-in-the-string-with-ascii-symbols/73193/6 "2023-05-03T12:34:21Z")

</div>

Apologies, forgot to use my own advice in my reply, lol
