diff --git a/question/type/shortanswer/question.php b/question/type/shortanswer/question.php index 72f0f4a38a1..f7070d8449b 100644 --- a/question/type/shortanswer/question.php +++ b/question/type/shortanswer/question.php @@ -102,6 +102,11 @@ class qtype_shortanswer_question extends question_graded_by_strategy $regexp .= 'i'; } + if (function_exists('normalizer_normalize')) { + $regexp = normalizer_normalize($regexp, Normalizer::FORM_C); + $string = normalizer_normalize($string, Normalizer::FORM_C); + } + return preg_match($regexp, trim($string)); } diff --git a/question/type/shortanswer/tests/question_test.php b/question/type/shortanswer/tests/question_test.php index 839712cf3f8..d287ff41ff5 100644 --- a/question/type/shortanswer/tests/question_test.php +++ b/question/type/shortanswer/tests/question_test.php @@ -106,6 +106,18 @@ class qtype_shortanswer_question_test extends advanced_testcase { // See http://moodle.org/mod/forum/discuss.php?d=120557 $this->assertTrue((bool)qtype_shortanswer_question::compare_string_with_wildcard( 'ITÁLIE', 'Itálie', true)); + + if (function_exists('normalizer_normalize')) { + // Test ambiguous unicode representations + $this->assertTrue((bool)qtype_shortanswer_question::compare_string_with_wildcard( + 'départ', 'DÉPART', true)); + $this->assertFalse((bool)qtype_shortanswer_question::compare_string_with_wildcard( + 'départ', 'DÉPART', false)); + $this->assertTrue((bool)qtype_shortanswer_question::compare_string_with_wildcard( + 'd'."\xC3\xA9".'part', 'd'."\x65\xCC\x81".'part', false)); + $this->assertTrue((bool)qtype_shortanswer_question::compare_string_with_wildcard( + 'd'."\xC3\xA9".'part', 'D'."\x45\xCC\x81".'PART', true)); + } } public function test_is_complete_response() {