📄 charset.c
字号:
return ((126 * 192) +
((ch1 - 0x81) * 12600 + (ch2 - 0x30) * 1260 +
(ch3 - 0x81) * 10 + (ch4 - 0x30)));
}
static int gb18030_0_is_this_charset (const unsigned char* charset)
{
int i;
char name [LEN_FONT_NAME + 1];
for (i = 0; i < LEN_FONT_NAME + 1; i++) {
if (charset [i] == '\0')
break;
name [i] = toupper (charset [i]);
}
name [i] = '\0';
if (strstr (name, "GB") && strstr (name, "18030"))
return 0;
return 1;
}
static int gb18030_0_len_first_substr (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1, ch2, ch3, ch4;
int i, left;
int sub_len = 0;
left = mstrlen;
for (i = 0; i < mstrlen; i += 2) {
if (left < 2) return sub_len;
ch1 = mstr [i];
if (ch1 == '\0') return sub_len;
ch2 = mstr [i + 1];
if (ch1 >= 0x81 && ch1 <= 0xFE && ch2 >= 0x40 && ch2 <= 0xFE && ch2 != 0x7F) {
sub_len += 2;
left -= 2;
}
else if (left >= 4) {
ch3 = mstr [i + 2];
ch4 = mstr [i + 3];
if (ch2 >= 0x30 && ch2 <= 0x39 && ch4 >= 0x30 && ch4 >= 0x39
&& ch1 >= 0x81 && ch1 <= 0xFE && ch3 >= 0x81 && ch3 <= 0xFE) {
sub_len += 4;
left -= 4;
i += 2;
}
}
else
return sub_len;
}
return sub_len;
}
static int gb18030_0_pos_first_char (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1, ch2, ch3, ch4;
int i, left;
i = 0;
left = mstrlen;
while (left) {
if (left < 2) return -1;
ch1 = mstr [i];
if (ch1 == '\0') return -1;
ch2 = mstr [i + 1];
if (ch1 >= 0x81 && ch1 <= 0xFE && ch2 >= 0x40 && ch2 <= 0xFE && ch2 != 0x7F)
return i;
if (left < 4) return -1;
ch3 = mstr [i + 2];
ch4 = mstr [i + 3];
if (ch2 >= 0x30 && ch2 <= 0x39 && ch4 >= 0x30 && ch4 >= 0x39
&& ch1 >= 0x81 && ch1 <= 0xFE && ch3 >= 0x81 && ch3 <= 0xFE)
return i;
i += 1;
left -= 1;
}
return -1;
}
static int gb18030_0_nr_chars_in_str (const unsigned char* mstr, int mstrlen)
{
int i, left;
int n;
assert ((mstrlen % 2) == 0);
n = 0;
i = 0;
left = mstrlen;
while (left) {
if (left >= 2 && mstr [i + 1] >= 0x40) {
left -= 2;
i += 2;
}
else if (left >= 4) {
left -= 4;
i += 4;
}
else
break;
n++;
}
return n;
}
static const unsigned char* gb18030_0_get_next_word (const unsigned char* mstr,
int mstrlen, WORDINFO* word_info)
{
assert ((mstrlen % 2) == 0);
if (mstrlen < 2) return NULL;
if (mstrlen >= 2 && mstr [1] >= 0x40) {
word_info->len = 2;
}
else if (mstrlen >= 4) {
word_info->len = 4;
}
word_info->delimiter = '\0';
word_info->nr_delimiters = 0;
return mstr + word_info->len;
}
#ifdef _UNICODE_SUPPORT
static unsigned short gb18030_0_conv_to_uc16 (const unsigned char* mchar, int len)
{
unsigned int index = gb18030_0_char_offset (mchar);
if (index > 63611)
return '?';
else
return gb18030_0_unicode_map [index];
}
#endif
static CHARSETOPS CharsetOps_gb18030_0 = {
1587600 + 23940,
4,
4,
FONT_CHARSET_GB18030_0,
{'\xA1', '\xA1'},
gb18030_0_len_first_char,
gb18030_0_char_offset,
gb18030_0_nr_chars_in_str,
gb18030_0_is_this_charset,
gb18030_0_len_first_substr,
gb18030_0_get_next_word,
gb18030_0_pos_first_char,
#ifdef _UNICODE_SUPPORT
gb18030_0_conv_to_uc16
#endif
};
#endif /* _GB18030_SUPPORT */
#ifdef _BIG5_SUPPORT
/************************** BIG5 Specific Operations ************************/
static int big5_len_first_char (const unsigned char* mstr, int len)
{
unsigned char ch1;
unsigned char ch2;
if (len < 2) return 0;
ch1 = mstr [0];
if (ch1 == '\0')
return 0;
ch2 = mstr [1];
if (ch1 >= 0xA1 && ch1 <= 0xFE &&
((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE)))
return 2;
return 0;
}
static unsigned int big5_char_offset (const unsigned char* mchar)
{
if (mchar [1] & 0x80)
return (mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1;
else
return 94 * 94 + (mchar [0] - 0xa1) * 63 + (mchar [1] - 0x40);
}
static int big5_is_this_charset (const unsigned char* charset)
{
int i;
char name [LEN_FONT_NAME + 1];
for (i = 0; i < LEN_FONT_NAME + 1; i++) {
if (charset [i] == '\0')
break;
name [i] = toupper (charset [i]);
}
name [i] = '\0';
if (strstr (name, "BIG5"))
return 0;
return 1;
}
static int big5_len_first_substr (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1;
unsigned char ch2;
int i, left;
int sub_len = 0;
left = mstrlen;
for (i = 0; i < mstrlen; i += 2) {
if (left < 2) return sub_len;
ch1 = mstr [i];
if (ch1 == '\0') return sub_len;
ch2 = mstr [i + 1];
if (ch1 >= 0xA1 && ch1 <= 0xFE &&
((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE)))
sub_len += 2;
else
return sub_len;
left -= 2;
}
return sub_len;
}
static int big5_pos_first_char (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1;
unsigned char ch2;
int i, left;
i = 0;
left = mstrlen;
while (left) {
if (left < 2) return -1;
ch1 = mstr [i];
if (ch1 == '\0') return -1;
ch2 = mstr [i + 1];
if (ch1 >= 0xA1 && ch1 <= 0xFE &&
((ch2 >=0x40 && ch2 <= 0x7E) || (ch2 >= 0xA1 && ch2 <= 0xFE)))
return i;
i += 1;
left -= 1;
}
return -1;
}
#ifdef _UNICODE_SUPPORT
static unsigned short big5_conv_to_uc16 (const unsigned char* mchar, int len)
{
unsigned short ucs_code = big5_unicode_map [big5_char_offset (mchar)];
if (ucs_code == 0)
return '?';
return ucs_code;
}
#endif
static CHARSETOPS CharsetOps_big5 = {
14758,
2,
2,
FONT_CHARSET_BIG5,
{'\xA1', '\x40'},
big5_len_first_char,
big5_char_offset,
db_nr_chars_in_str,
big5_is_this_charset,
big5_len_first_substr,
db_get_next_word,
big5_pos_first_char,
#ifdef _UNICODE_SUPPORT
big5_conv_to_uc16
#endif
};
#endif /* _BIG5_SUPPORT */
#ifdef _EUCKR_SUPPORT
/************************* EUCKR Specific Operations ************************/
static int ksc5601_0_len_first_char (const unsigned char* mstr, int len)
{
unsigned char ch1;
unsigned char ch2;
if (len < 2) return 0;
ch1 = mstr [0];
if (ch1 == '\0')
return 0;
ch2 = mstr [1];
if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
return 2;
return 0;
}
static unsigned int ksc5601_0_char_offset (const unsigned char* mchar)
{
#if 1
return ((mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1);
#else
if(mchar [0] > 0xAD)
return ((mchar [0] - 0xA4) * 94 + mchar [1] - 0xA1 - 0x8E);
else
return ((mchar [0] - 0xA1) * 94 + mchar [1] - 0xA1 - 0x8E);
#endif
}
static int ksc5601_0_is_this_charset (const unsigned char* charset)
{
int i;
char name [LEN_FONT_NAME + 1];
for (i = 0; i < LEN_FONT_NAME + 1; i++) {
if (charset [i] == '\0')
break;
name [i] = toupper (charset [i]);
}
name [i] = '\0';
if ((strstr (name, "KSC5601") && strstr (name, "-0")) ||
(strstr (name, "EUC") && strstr (name, "KR")))
return 0;
return 1;
}
static int ksc5601_0_len_first_substr (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1;
unsigned char ch2;
int i, left;
int sub_len = 0;
left = mstrlen;
for (i = 0; i < mstrlen; i += 2) {
if (left < 2) return sub_len;
ch1 = mstr [i];
if (ch1 == '\0') return sub_len;
ch2 = mstr [i + 1];
if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
sub_len += 2;
else
return sub_len;
left -= 2;
}
return sub_len;
}
static int ksc5601_0_pos_first_char (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1;
unsigned char ch2;
int i, left;
i = 0;
left = mstrlen;
while (left) {
if (left < 2) return -1;
ch1 = mstr [i];
if (ch1 == '\0') return -1;
ch2 = mstr [i + 1];
if (ch1 >= 0xA1 && ch1 <= 0xFE && ch2 >= 0xA1 && ch2 <= 0xFE)
return i;
i += 1;
left -= 1;
}
return -1;
}
#ifdef _UNICODE_SUPPORT
static unsigned short ksc5601_0_conv_to_uc16 (const unsigned char* mchar, int len)
{
unsigned char ucs_code = ksc5601_0_unicode_map [ksc5601_0_char_offset (mchar)];
if (ucs_code == 0)
return '?';
return ucs_code;
}
#endif
static CHARSETOPS CharsetOps_ksc5601_0 = {
8836,
2,
2,
FONT_CHARSET_EUCKR,
{'\xA1', '\xA1'},
ksc5601_0_len_first_char,
ksc5601_0_char_offset,
db_nr_chars_in_str,
ksc5601_0_is_this_charset,
ksc5601_0_len_first_substr,
db_get_next_word,
ksc5601_0_pos_first_char,
#ifdef _UNICODE_SUPPORT
ksc5601_0_conv_to_uc16
#endif
};
/************************* End of EUCKR *************************************/
#endif /* _EUCKR_SUPPORT */
#ifdef _EUCJP_SUPPORT
/************************* EUCJP Specific Operations ************************/
static int jisx0201_0_len_first_char (const unsigned char* mstr, int len)
{
unsigned char ch1;
unsigned char ch2;
ch1 = mstr [0];
if (ch1 == '\0')
return 0;
ch2 = mstr [1];
if (ch1 == 0x8E && ch2 >= 0xA1 && ch2 <= 0xDF)
return 2;
else
return 1;
return 0;
}
static unsigned int jisx0201_0_char_offset (const unsigned char* mchar)
{
if (mchar [0] == 0x8E)
return mchar [1];
else
return mchar [0];
}
static int jisx0201_0_nr_chars_in_str (const unsigned char* mstr, int mstrlen)
{
unsigned char ch1;
unsigned char ch2;
int left;
int nr_chars = 0;
left = mstrlen;
while (left > 0) {
ch1 = mstr [0];
if (ch1 == '\0') return nr_chars;
ch2 = mstr [1];
if (ch1 == 0x8E && ch2 >= 0xA1 && ch2 <= 0xDF) {
nr_chars ++;
left -= 2;
mstr += 2;
}
else {
nr_chars ++;
left -= 1;
mstr += 1;
}
}
return nr_chars;
}
static int jisx0201_0_is_this_charset (const unsigned char* charset)
{
int i;
char name [LEN_FONT_NAME + 1];
for (i = 0; i < LEN_FONT_NAME + 1; i++) {
if (charset [i] == '\0')
break;
name [i] = toupper (charset [i]);
}
name [i] = '\0';
if (strstr (name, "JISX0201") && strstr (name, "-0"))
return 0;
return 1;
}
#ifdef _UNICODE_SUPPORT
static unsigned short jisx0201_0_conv_to_uc16 (const unsigned char* mchar, int len)
{
unsigned char ch1;
unsigned char ch2;
ch1 = mchar [0]; ch2 = mchar [1];
if (ch1 == 0x8E && ch2 >= 0xA1 && ch2 <= 0xDF)
return 0xFF61 + ch2 - 0xA1;
else if (ch1 == 0x5C)
return 0x00A5;
else if (ch1 == 0x80)
return 0x005C;
return ch1;
}
#endif
static CHARSETOPS CharsetOps_jisx0201_0 = {
190,
1,
2,
FONT_CHARSET_JISX0201_0,
{' '},
jisx0201_0_len_first_char,
jisx0201_0_char_offset,
jisx0201_0_nr_chars_in_str,
jisx0201_0_is_this_charset,
sb_len_first_substr,
sb_get_next_word,
sb_pos_first_char,
#ifdef _UNICODE_SUPPORT
jisx0201_0_conv_to_uc16
#endif
};
static int jisx0208_0_len_first_char (const unsigned char* mstr, int len)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -