9
\$\begingroup\$

I would like to buy an LCD screen fom Arduino to display some results from a web http call; the Web API returns a JSON text encoded in UTF-8.

I've read that ICU is the way to go to handle Unicode in C/C++ programs for Arduino.

My questions:
Will I be able to display UTF-8 characters to this kind of screen?
Are there (affordable) character LCD screens able to display UTF-8 characters?

\$\endgroup\$
1
  • 3
    \$\begingroup\$ Are we talkign about a graphical display or a segmented character display? On a segmented display, you can't obviously display anythign that does not fit the segment pattern. For "western" non-ascii uses, you can probably fall back to the base (non-accented etc.) character. For other scripts you are most likely out of luck. \$\endgroup\$
    – drxzcl
    Apr 29, 2011 at 10:26

2 Answers 2

7
\$\begingroup\$

I'm not that much familiar with Arduino, but let's look at it from the LCD perspective.

Virtually all popular character LCDs use HD44780 controller these days (that's what LiquidCrystal library supports). This controller doesn't support UTF-8 directly, each character is represented by a single byte.

Thus you need to convert UTF-8 to 8-bit characters manually. The controller has a built-in character generator with 208 5x8 and 32 5x10 characters, plus up to 8 user-defined characters (see createChar). You need to map every input character to one of the predefined/custom characters - obviously you can only display a subset of UTF8 characters, you need to decide which characters you want/can to display.

The conversion itself should be pretty straightforward - you just need to iterate over the UTF8 string, mapping every character to a single byte. Most likely you'll want to use a lookup tables to keep it simple. Let me know if this needs further explanation.

\$\endgroup\$
2
  • \$\begingroup\$ thank you; do you think this kind of Tft graphical display could offer a better unicode support? \$\endgroup\$ Apr 29, 2011 at 13:05
  • 1
    \$\begingroup\$ This is a graphics display, as far as I can see, so it can display pretty much anything you want. The library provided provides functions to paint text as well, but again it supports 8-bit characters only. So, with this display you either need to the same sort of conversion as described above and use the library as is, or you have to modify the library to support UTF8. Keep in mind, that using a graphics display will make your code bigger - you need extra library, font, etc. But at least you have full control of the available character set - the font is part of the software. \$\endgroup\$ Apr 29, 2011 at 13:22
4
\$\begingroup\$

Unicode is complicated and big, in its entirety it is too big for an Arduino. In the current version there are in total over 100000 characters, including cuneiform, hieroglyphics, Klingon, and not to mention many thousands of chinese characters.

So if you really want to show some Unicode characters on an Arduino:

  • Get a graphic display. The one you mention is a character display, it can only show a mostly fixed set of 256 characters.

  • Define a small subset of characters you want to handle. There are some predefined subsets, for example the Multilingual European Subsets look nice.

  • Get some fonts and strip them down to the set you need. Note that even displaying can be much more complicated than what you are used to from ASCII, due to combining characters, bidirectional writing and such. Best is probably to stick to latin characters without any combining accents. Cyrillic and greek should be ok, too, as should anything that is a simple left-to-right sequence of characters.

  • Maybe you could use some external memory to store the fonts.

Then there's a whole lot of other topics you probably don't need, for example sorting and searching, see the Unicode standard and its annexes (it's big!).

Forget ICU, it needs megabytes of memory.

\$\endgroup\$
1
  • \$\begingroup\$ I'll have to try putting (a subset!) of ICU on the Arduino.. should be fun. \$\endgroup\$ Sep 12, 2012 at 21:05

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.