]> granicus.if.org Git - php/commitdiff
Don't mangle non-Japanese chars which appear after a 'combining' kana in SJIS-2004
authorAlex Dowad <alexinbeijing@gmail.com>
Thu, 17 Sep 2020 20:34:59 +0000 (22:34 +0200)
committerAlex Dowad <alexinbeijing@gmail.com>
Wed, 11 Nov 2020 09:18:58 +0000 (11:18 +0200)
Unicode has 'combining' characters which join with another following character.
Japanese hiragana and katakana with the 'two dots' voice mark can be represented
in this way, with one Unicode character for the 'base' kana and another one which
adds the voice mark.

In SJIS-2004, however, there are dedicated characters for voiced and unvoiced
kana. So some special checks are done to identify sequences of Unicode characters
which need to be 'collapsed' into a single SJIS-2004 character.

If a kana is immediately followed by some other unrelated character, like a
Cyrillic letter, then the cached kana should be output 'as is' and we
proceed with encoding the unrelated character. When doing this, though,
we need to re-initialize local variables, or else the unrelated character
will be mangled in some cases.

ext/mbstring/libmbfl/filters/mbfilter_sjis_2004.c

index a81cd29b705378d4028c21cb5c5697016b3924a3..02bbdccdc87334fbbcfd9289e83a766e66c775ad 100644 (file)
@@ -485,10 +485,10 @@ int mbfl_filt_conv_jis2004_wchar_flush(mbfl_convert_filter *filter)
 int
 mbfl_filt_conv_wchar_jis2004(int c, mbfl_convert_filter *filter) {
        int k;
-       int c1, c2, s1 = 0, s2;
+       int c1, c2, s1, s2;
 
 retry:
-
+       s1 = 0;
        /* check for 1st char of combining characters */
        if ((filter->status & 0xf)== 0 && (
                        c == 0x00E6 ||