diff options
author | Dominik Riebeling <Dominik.Riebeling@gmail.com> | 2012-04-06 20:21:29 +0200 |
---|---|---|
committer | Jens Arnold <amiconn@rockbox.org> | 2012-05-19 01:42:53 +0200 |
commit | 2d9c0bab540274e99480d965f38f266d20097976 (patch) | |
tree | e004fcdc65cd091521ca12575b82e672cc5908e3 /tools/codepages.c | |
parent | 4a6b875eda8fe7827b8a55e42e48184a6588ee4c (diff) | |
download | rockbox-2d9c0bab540274e99480d965f38f266d20097976.tar.gz rockbox-2d9c0bab540274e99480d965f38f266d20097976.zip |
Add support for cp1252 (Western European) codepage.
In Europe Windows defaults to its own codepage cp1252 (also known as "WinLatin"
or "Windows-1252"). cp1252 adds some characters to ISO-8859-1.
Some mp3 tagging software on Windows uses cp1252 instead of ISO-8859-1. This
violates the ID3 specification, which requires tags to be ISO-8859-1 or
Unicode. However, similar violations are made for other codepages and supported
by Rockbox using the "Default Codepage" setting. Add support for cp1252 to
enable people using such broken tools to override the correct decoding to get
their tags displayed properly.
Change-Id: I9f2ec478afe2503e99ee8e6609416c92b0f453e0
Reviewed-on: http://gerrit.rockbox.org/209
Reviewed-by: Jens Arnold <amiconn@rockbox.org>
Tested-by: Jens Arnold <amiconn@rockbox.org>
Diffstat (limited to 'tools/codepages.c')
-rw-r--r-- | tools/codepages.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/tools/codepages.c b/tools/codepages.c index 9c214397de..fb01c4dfb3 100644 --- a/tools/codepages.c +++ b/tools/codepages.c | |||
@@ -25,8 +25,8 @@ | |||
25 | 25 | ||
26 | #define MAX_TABLE_SIZE 32768 | 26 | #define MAX_TABLE_SIZE 32768 |
27 | 27 | ||
28 | static const int mini_index[6] = { | 28 | static const int mini_index[7] = { |
29 | 0, 1, 3, 6, 7, 8 | 29 | 0, 1, 3, 6, 7, 8, 9 |
30 | }; | 30 | }; |
31 | 31 | ||
32 | static unsigned short iso_table[MAX_TABLE_SIZE]; | 32 | static unsigned short iso_table[MAX_TABLE_SIZE]; |
@@ -140,7 +140,7 @@ unsigned short iso_decode(unsigned char *latin1, int cp, int count) | |||
140 | ucs = iso8859_2_to_uni[*latin1++ - 0xA1]; | 140 | ucs = iso8859_2_to_uni[*latin1++ - 0xA1]; |
141 | } | 141 | } |
142 | break; | 142 | break; |
143 | 143 | ||
144 | case 0x08: /* Central European (CP1250) */ | 144 | case 0x08: /* Central European (CP1250) */ |
145 | while (count--) { | 145 | while (count--) { |
146 | /* first convert to unicode */ | 146 | /* first convert to unicode */ |
@@ -150,7 +150,17 @@ unsigned short iso_decode(unsigned char *latin1, int cp, int count) | |||
150 | ucs = cp1250_to_uni[*latin1++ - 0x80]; | 150 | ucs = cp1250_to_uni[*latin1++ - 0x80]; |
151 | } | 151 | } |
152 | break; | 152 | break; |
153 | 153 | ||
154 | case 0x09: /* Western European (CP1252) */ | ||
155 | while (count--) { | ||
156 | /* first convert to unicode */ | ||
157 | if (*latin1 < 0x80 || *latin1 >= 0xa0) | ||
158 | ucs = *latin1++; | ||
159 | else | ||
160 | ucs = cp1252_to_uni[*latin1++ - 0x80]; | ||
161 | } | ||
162 | break; | ||
163 | |||
154 | default: | 164 | default: |
155 | break; | 165 | break; |
156 | } | 166 | } |
@@ -209,7 +219,7 @@ int main(int argc, char **argv) | |||
209 | of = fopen("isomini.cp", "wb"); | 219 | of = fopen("isomini.cp", "wb"); |
210 | if (!of) return 1; | 220 | if (!of) return 1; |
211 | 221 | ||
212 | for (i=1; i<6; i++) { | 222 | for (i=1; i<7; i++) { |
213 | 223 | ||
214 | for (j=0; j<128; j++) { | 224 | for (j=0; j<128; j++) { |
215 | k = (unsigned char)j + 128; | 225 | k = (unsigned char)j + 128; |
@@ -223,7 +233,7 @@ int main(int argc, char **argv) | |||
223 | of = fopen("iso.cp", "wb"); | 233 | of = fopen("iso.cp", "wb"); |
224 | if (!of) return 1; | 234 | if (!of) return 1; |
225 | 235 | ||
226 | for (i=1; i<9; i++) { | 236 | for (i=1; i<10; i++) { |
227 | 237 | ||
228 | for (j=0; j<128; j++) { | 238 | for (j=0; j<128; j++) { |
229 | k = (unsigned char)j + 128; | 239 | k = (unsigned char)j + 128; |