Link to home
Start Free TrialLog in
Avatar of TremorBlue
TremorBlueFlag for United Kingdom of Great Britain and Northern Ireland

asked on

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
Avatar of TremorBlue
TremorBlue
Flag of United Kingdom of Great Britain and Northern Ireland image

ASKER

They were converted to ??? as well..  try here.

http://www.russianlessons.net/vocabulary/nouns_days.php
Avatar of Infinity08
For Unicode support, it's best to use an external library, like ICU :

        http://site.icu-project.org/
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

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.
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 :)
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?

Sara
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 ?
ASKER CERTIFIED SOLUTION
Avatar of JimBeveridge
JimBeveridge
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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.