Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

SimpleDateFormat localized month names

I have searched throughout the site but I think I have a slightly different issue and could really do with some help before I either have heart failure or burn the computer.

I dynamically generate a list of month names (in the form June 2011, July 2011) and obviously I want this to be locale sensitive: hence I use the simple date format object as follows:

//the actual locale name is dependent on UI selection
Locale localeObject=new Locale("pl"); 
// intended to return full month name - in local language.
DateFormat dtFormat = new SimpleDateFormat("MMMM yyyy",localeObject);
//this bit just sets up a calendar (used for other bits but here to illustrate the issue
String systemTimeZoneName = "GMT";
TimeZone systemTimeZone=TimeZone.getTimeZone(systemTimeZoneName);
Calendar mCal = new GregorianCalendar(systemTimeZone); //"gmt" time
mCal.getTime(); //current date and time

but if I do this:

String value=dtFormat.format(mCal.getTime()); 

this "should" return the localized version of the month name. In polish the word "September" is "Wrzesień" -- note the accent on the n. However all I get back is "Wrzesie?"

What am I doing wrong?

Thanks to all - I accept now that it's a presentation issue - but how can I "read" the result from dtFormat safely - I added some comments below ref using getBytes etc. - this worked in other situations, I just can't seem to get access to the string result without messing it up

-- FINAL Edit; for anyone that comes accross this issue

The answer was on BalusC's blog : http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html#DevelopmentEnvironment

Basically the DTformat object was returning UTF-8 and was being automatically transformed back to the system default character set when I read it into a string

so this code worked for me

new String(dtFormat.format(mCal.getTime()).getBytes("UTF-8"),"ISO-8859-1");

thank you very much for the assistance

like image 769
Kelly Avatar asked Oct 03 '11 18:10

Kelly


1 Answers

Your problem has nothing to do with SimpleDateFormat - you're just doing the wrong thing with the result.

You haven't told us what you're doing with the string afterwards - how you're displaying it in the UI - but that's the problem. You can see that it's fetching a localized string; it's only the display of the accented character which is causing a problem. You would see exactly the same thing if you had a string constant in there containing the same accented character.

I suggest you check all the encodings used throughout your app if it's a web app, or check the font you're displaying the string in if it's a console or Swing app.

If you examine the string in the debugger I'm sure you'll see it's got exactly the right characters - it's just how they're getting to the user which is the problem.

like image 164
Jon Skeet Avatar answered Oct 14 '22 04:10

Jon Skeet