Browse Source

fixed incorrect encoding conversion in korean.

experimental/threaded
Rui Hirokawa 24 years ago
parent
commit
8a2b5991d6
  1. 18
      ext/mbstring/mbfilter_kr.c
  2. 1592
      ext/mbstring/unicode_table_kr.h

18
ext/mbstring/mbfilter_kr.c

@ -70,14 +70,14 @@ mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter TSRMLS_DC)
flag = 2;
}
if (flag > 0 && c >= 0xa1 && c <= 0xfe) {
if (flag == 1){
w = (c1 - 0xa1)*178 + (c - 0xa1) + 0x54;
if (flag == 1){ /* 1st: 0xa1..0xc6, 2nd: 0x41..0x7a, 0x81..0xfe */
w = (c1 - 0xa1)*190 + (c - 0x41);
if (w >= 0 && w < uhc2_ucs_table_size) {
w = uhc2_ucs_table[w];
} else {
w = 0;
}
} else {
} else { /* 1st: 0xc7..0xc8,0xca..0xfe, 2nd: 0xa1..0xfe */
if (c1 < 0xc9){
w = (c1 - 0xc7)*94 + c - 0xa1;
} else {
@ -311,6 +311,8 @@ mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter TSRMLS_DC)
s = ucs_a3_uhc_table[c - ucs_a3_uhc_table_min];
} else if (c >= ucs_i_uhc_table_min && c < ucs_i_uhc_table_max) {
s = ucs_i_uhc_table[c - ucs_i_uhc_table_min];
} else if (c >= ucs_s_uhc_table_min && c < ucs_s_uhc_table_max) {
s = ucs_s_uhc_table[c - ucs_s_uhc_table_min];
} else if (c >= ucs_r1_uhc_table_min && c < ucs_r1_uhc_table_max) {
s = ucs_r1_uhc_table[c - ucs_r1_uhc_table_min];
} else if (c >= ucs_r2_uhc_table_min && c < ucs_r2_uhc_table_max) {
@ -341,17 +343,13 @@ mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter TSRMLS_DC)
s = -1;
}
if (s >= 0) {
if (s < 0x80) { /* ASCII */
if (s < 0x80 && s > 0) { /* ASCII */
if ((filter->status & 0x10) != 0) {
CK((*filter->output_function)(0x0f, filter->data TSRMLS_CC)); /* SI */
filter->status &= ~0x10;
}
CK((*filter->output_function)(s, filter->data TSRMLS_CC));
} else {
if ((filter->status & 0x10) == 0) {
CK((*filter->output_function)(0x0e, filter->data TSRMLS_CC)); /* SO */
filter->status |= 0x10;
}
if ( (filter->status & 0x100) == 0) {
CK((*filter->output_function)(0x1b, filter->data TSRMLS_CC)); /* ESC */
CK((*filter->output_function)(0x24, filter->data TSRMLS_CC)); /* '$' */
@ -359,6 +357,10 @@ mbfl_filt_conv_wchar_2022kr(int c, mbfl_convert_filter *filter TSRMLS_DC)
CK((*filter->output_function)(0x43, filter->data TSRMLS_CC)); /* 'C' */
filter->status |= 0x100;
}
if ((filter->status & 0x10) == 0) {
CK((*filter->output_function)(0x0e, filter->data TSRMLS_CC)); /* SO */
filter->status |= 0x10;
}
CK((*filter->output_function)((s >> 8) & 0xff, filter->data TSRMLS_CC));
CK((*filter->output_function)(s & 0xff, filter->data TSRMLS_CC));
}

1592
ext/mbstring/unicode_table_kr.h
File diff suppressed because it is too large
View File

Loading…
Cancel
Save