• C

How to represent a russian string ( unicode ) in a C string..

I need to store russian months in an array ?

I am working on an older embedded project and need to represent Russian months in c source code. With this processor the characters are 16bits so I can put unicoode characters in them.
But all the string functions are 8bits.  If I enter the unicode characters in the IDE I get ???? instead.

static const char*sEnglishNames[13] ={"","January","February","March","April","May",
"June","July","August","September","October","November", "December"};

Russian months

¿¿¿¿¿¿   -   January
¿¿¿¿¿¿¿   -   February
¿¿¿¿   -   March
¿¿¿¿¿¿   -   April
¿¿¿   -   May
¿¿¿¿   -   June
¿¿¿¿   -   July
¿¿¿¿¿¿   -   August
¿¿¿¿¿¿¿¿   -   September
¿¿¿¿¿¿¿   -   October
¿¿¿¿¿¿   -   November
¿¿¿¿¿¿¿   -   December
Who is Participating?
Characters are just numbers - even Unicode characters. Write the Unicode file in your favorite editor. Put a a space between each month. For example, in English:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec

Write a short application that opens the file and spits out the raw binary as C bytes. For example, the output for the English above would be:

unsigned char months[] = {
0x4A, 0x00, 0x61, 0x00, 0x6E, 0x00, 0x20, 0x00, 0x46, 0x00, 0x65, 0x00, 0x62, 0x00, 0x20, 0x00
0x4D, 0x00, 0x61, 0x00, 0x72, 0x00, 0x20, 0x00, 0x41, 0x00, 0x70, 0x00, 0x72, 0x00, 0x20, 0x00
0x4D, 0x00, 0x61, 0x00, 0x79, 0x00, 0x20, 0x00, 0x4A, 0x00, 0x75, 0x00, 0x6E, 0x00, 0x20, 0x00
0x4A, 0x00, 0x75, 0x00, 0x6C, 0x00, 0x20, 0x00, 0x41, 0x00, 0x75, 0x00, 0x67, 0x00, 0x20, 0x00
0x53, 0x00, 0x65, 0x00, 0x70, 0x00, 0x20, 0x00, 0x4F, 0x00, 0x63, 0x00, 0x74, 0x00, 0x20, 0x00
4E, 0x00, 0x6F, 0x00, 0x76, 0x00, 0x20, 0x00, 0x44, 0x00, 0x65, 0x00, 0x63, 0x00

Open in new window

TremorBlueAuthor Commented:
They were converted to ??? as well..  try here.

For Unicode support, it's best to use an external library, like ICU :

Making Bulk Changes to Active Directory

Watch this video to see how easy it is to make mass changes to Active Directory from an external text file without using complicated scripts.

Todd GerbertIT ConsultantCommented:
Works for me copy & pasting the Russian names.  Note however, that your unicode strings are going to be wchar_t* and not char*, unicode string literals are prefixed with "L", and you need to make sure your editor will save your source code file as unicode.

wchar_t *sRussianMonths[3] = { L"¿¿¿¿¿¿", L"¿¿¿¿¿¿¿", L"¿¿¿¿"};

Open in new window

Todd GerbertIT ConsultantCommented:
Well, I guess EE doesn't support Unicode strings. ;)

Maybe if I don't put it in a code block...

wchar_t *sRussianMonths[3] = { L"¿¿¿¿¿¿", L"¿¿¿¿¿¿¿", L"¿¿¿¿"};
wchar_t is very platform dependent, and is not guaranteed to be able to store the Unicode character you try to put in it. So, it is not recommended to use it if you need Unicode support in your application - especially not if you'd like that Unicode support to be portable.

Instead, use an external library like the one I suggested earlier.
Todd GerbertIT ConsultantCommented:
Agreed, http:#a35439793 is the better approach - I had just left the window sitting open for a few minutes and so didn't see your comment before I hit submit. ;)
An open window is good !! Brings in fresh air :)
TremorBlueAuthor Commented:
Yes but forget about experts exchange I don't mind that it doesnt work there.

 I want to know how to do unicode strings inside an old ccompiler.

 I was thinking about just using the unicode numbers .. ?
Please refer to my first reply ;)
how old is the c compiler?

can you check whether the below compiles

#include <stdio.h>

int main()
    wchar_t * pws = L"January";
    int szwc = sizeof(wchar_t);
    wprintf(L"%s %d", pws, szwc);    
    return 0;

Open in new window

and if yes tell whether it prints correctly?

TremorBlueAuthor Commented:
The compiler does not support wchar_t.

I don't need to have a library like ICU.

As my question says I just need to store the unicode characters in an array.

It looks like I have to store the characters in an array of shorts.
>> As my question says I just need to store the unicode characters in an array.

So you don't ever want to display them ?
Can you be sure that all unicode characters you'll ever use will be (exactly) 16 bits wide ?
Forgot the final instructions - create an array of points that are indexed into the array above. This can be done automatically at runtime by searching for the spaces, which you'll then want to turn into zeros so that the strings are null terminated. (Also, my sample array needs ,0x00,0x00 at the end to terminate it properly.)

One thing you have to be careful of is that you have to read the file and write the result as bytes, not as shorts, otherwise you'll have problems on little-endian architectures.
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.