We help IT Professionals succeed at work.

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

TremorBlue
TremorBlue asked
on
507 Views
Last Modified: 2012-05-11
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
Comment
Watch Question

Author

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

http://www.russianlessons.net/vocabulary/nouns_days.php
CERTIFIED EXPERT
Top Expert 2009

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

        http://site.icu-project.org/
Todd GerbertSenior Engineer
CERTIFIED EXPERT
Top Expert 2010

Commented:
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 GerbertSenior Engineer
CERTIFIED EXPERT
Top Expert 2010

Commented:
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"¿¿¿¿"};
CERTIFIED EXPERT
Top Expert 2009

Commented:
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 GerbertSenior Engineer
CERTIFIED EXPERT
Top Expert 2010

Commented:
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. ;)
CERTIFIED EXPERT
Top Expert 2009

Commented:
An open window is good !! Brings in fresh air :)

Author

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 .. ?
CERTIFIED EXPERT
Top Expert 2009

Commented:
Please refer to my first reply ;)
CERTIFIED EXPERT
Top Expert 2016

Commented:
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

Author

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.
CERTIFIED EXPERT
Top Expert 2009

Commented:
>> 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 ?
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION
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.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.