rockbox/firmware/include/rbunicode.h
Dominik Riebeling 2d9c0bab54 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>
2012-05-19 01:42:53 +02:00

83 lines
2.9 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (c) 2004,2005 by Marcoen Hirschberg
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
/* Some conversion functions for handling UTF-8
*
* I got all the info from:
* http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
* and
* http://en.wikipedia.org/wiki/Unicode
*/
#ifndef _RBUNICODE_H_
#define _RBUNICODE_H_
#include "config.h"
#define MASK 0xC0 /* 11000000 */
#define COMP 0x80 /* 10x */
#ifdef HAVE_LCD_BITMAP
enum codepages {
ISO_8859_1 = 0, /* Latin1 */
ISO_8859_7, /* Greek */
ISO_8859_8, /* Hebrew */
WIN_1251, /* Cyrillic */
ISO_8859_11, /* Thai */
WIN_1256, /* Arabic */
ISO_8859_9, /* Turkish */
ISO_8859_2, /* Latin Extended */
WIN_1250, /* Central European */
WIN_1252, /* Western European */
SJIS, /* Japanese */
GB_2312, /* Simp. Chinese */
KSX_1001, /* Korean */
BIG_5, /* Trad. Chinese */
UTF_8, /* Unicode */
NUM_CODEPAGES
};
#else /* !HAVE_LCD_BITMAP, reduced support */
enum codepages {
ISO_8859_1 = 0, /* Latin1 */
ISO_8859_7, /* Greek */
WIN_1251, /* Cyrillic */
ISO_8859_9, /* Turkish */
ISO_8859_2, /* Latin Extended */
WIN_1250, /* Central European */
WIN_1252, /* Western European */
UTF_8, /* Unicode */
NUM_CODEPAGES
};
#endif
/* Encode a UCS value as UTF-8 and return a pointer after this UTF-8 char. */
unsigned char* utf8encode(unsigned long ucs, unsigned char *utf8);
unsigned char* iso_decode(const unsigned char *latin1, unsigned char *utf8, int cp, int count);
unsigned char* utf16LEdecode(const unsigned char *utf16, unsigned char *utf8, int count);
unsigned char* utf16BEdecode(const unsigned char *utf16, unsigned char *utf8, int count);
unsigned long utf8length(const unsigned char *utf8);
const unsigned char* utf8decode(const unsigned char *utf8, unsigned short *ucs);
void set_codepage(int cp);
int utf8seek(const unsigned char* utf8, int offset);
const char* get_codepage_name(int cp);
#endif /* _RBUNICODE_H_ */