Skip to content

Commit e6501c3

Browse files
authored
Merge pull request #379 from iMattPro/fixes
Fix ncr gaps
2 parents 382a96f + c7bdb5f commit e6501c3

4 files changed

Lines changed: 43 additions & 11 deletions

File tree

‎entity/rule.php‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,7 @@ public function set_title($title)
273273
// Enforce a string
274274
$title = (string) $title;
275275

276-
// Replace four-byte UTF-8 characters before storing in utf8mb3 columns.
277-
$title = utf8_encode_ucr($title);
276+
$title = $this->encode_unicode_for_storage($title);
278277

279278
// Limit both the displayed and stored title lengths to the column size.
280279
if (truncate_string($title, 200, 200) !== $title)
@@ -288,6 +287,22 @@ public function set_title($title)
288287
return $this;
289288
}
290289

290+
/**
291+
* Encode Unicode characters that cannot be stored safely by the DBMS.
292+
*
293+
* @param string $text
294+
* @return string
295+
*/
296+
protected function encode_unicode_for_storage($text)
297+
{
298+
if (strpos($this->db->get_sql_layer(), 'mssql') === 0)
299+
{
300+
return utf8_encode_ncr($text);
301+
}
302+
303+
return utf8_encode_ucr($text);
304+
}
305+
291306
/**
292307
* Get message for edit
293308
*

‎migrations/v10x/m7_sample_rule_data.php‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,8 @@ public function insert_sample_rule_data()
8181
// Define sample rule data
8282
$sample_rule_data = array(
8383
array(
84-
'rule_title' => $lang->lang('BOARDRULES_SAMPLE_CATEGORY_TITLE'),
85-
'rule_message' => $lang->lang('BOARDRULES_SAMPLE_CATEGORY_MESSAGE'),
84+
'rule_title' => utf8_encode_ncr($lang->lang('BOARDRULES_SAMPLE_CATEGORY_TITLE')),
85+
'rule_message' => utf8_encode_ncr($lang->lang('BOARDRULES_SAMPLE_CATEGORY_MESSAGE')),
8686
'rule_anchor' => $lang->lang('BOARDRULES_SAMPLE_CATEGORY_ANCHOR'),
8787
'rule_left_id' => 1,
8888
'rule_right_id' => 4,
@@ -91,8 +91,8 @@ public function insert_sample_rule_data()
9191
'rule_parents' => '',
9292
),
9393
array(
94-
'rule_title' => $lang->lang('BOARDRULES_SAMPLE_RULE_TITLE'),
95-
'rule_message' => $lang->lang('BOARDRULES_SAMPLE_RULE_MESSAGE'),
94+
'rule_title' => utf8_encode_ncr($lang->lang('BOARDRULES_SAMPLE_RULE_TITLE')),
95+
'rule_message' => utf8_encode_ncr($lang->lang('BOARDRULES_SAMPLE_RULE_MESSAGE')),
9696
'rule_anchor' => $lang->lang('BOARDRULES_SAMPLE_RULE_ANCHOR'),
9797
'rule_left_id' => 2,
9898
'rule_right_id' => 3,

‎tests/entity/rule_entity_save_test.php‎

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@ public function test_save($id, $expected)
7373
self::assertEquals($expected['rule_title'], $result->get_title());
7474
}
7575

76-
public function test_four_byte_title_characters_are_encoded_for_storage_and_decoded_on_read()
76+
public function test_unicode_title_characters_are_encoded_for_storage_and_decoded_on_read()
7777
{
7878
$entity = $this->get_rule_entity();
7979
$entity->load(1)
8080
->set_anchor('emoji-title')
81-
->set_title('Emoji 😀 title')
81+
->set_title('Emoji 😀 中文 Кириллица title')
8282
->save();
8383

8484
$result = $this->db->sql_query('SELECT rule_anchor, rule_title
@@ -88,11 +88,14 @@ public function test_four_byte_title_characters_are_encoded_for_storage_and_deco
8888
$this->db->sql_freeresult($result);
8989

9090
self::assertSame('emoji-title', $row['rule_anchor']);
91-
self::assertSame('Emoji 😀 title', $row['rule_title']);
91+
$expected_title = strpos($this->db->get_sql_layer(), 'mssql') === 0
92+
? 'Emoji 😀 中文 Кириллица title'
93+
: 'Emoji 😀 中文 Кириллица title';
94+
self::assertSame($expected_title, $row['rule_title']);
9295

9396
$entity->load(1);
9497
self::assertSame('emoji-title', $entity->get_anchor());
95-
self::assertSame('Emoji 😀 title', $entity->get_title());
98+
self::assertSame('Emoji 😀 中文 Кириллица title', $entity->get_title());
9699
}
97100

98101
/**

‎tests/functional/admin_controller_test.php‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,9 @@ public function test_acp_create_rule($crawler)
148148
self::assertCount(0, $crawler->filter('.successbox'));
149149

150150
// Submit valid rule data
151+
$rule_title = 'Test 😀 中文 Кириллица Rule';
151152
$form = $crawler->selectButton($this->lang('SUBMIT'))->form(array(
152-
'rule_title' => 'Test Rule',
153+
'rule_title' => $rule_title,
153154
'rule_anchor' => 'test-rule',
154155
'rule_message' => str_repeat('test ', 1000), // 5000 character message
155156
));
@@ -158,6 +159,19 @@ public function test_acp_create_rule($crawler)
158159
// Assert addition was success
159160
self::assertGreaterThan(0, $crawler->filter('.successbox')->count());
160161
$this->assertContainsLang('ACP_RULE_ADDED', $crawler->text());
162+
163+
$this->get_db();
164+
$result = $this->db->sql_query("SELECT rule_title
165+
FROM phpbb_boardrules
166+
WHERE rule_anchor = 'test-rule'");
167+
$stored_title = $this->db->sql_fetchfield('rule_title', false, $result);
168+
$this->db->sql_freeresult($result);
169+
170+
$expected_title = strpos($this->db->get_sql_layer(), 'mssql') === 0
171+
? 'Test 😀 中文 Кириллица Rule'
172+
: 'Test 😀 中文 Кириллица Rule';
173+
self::assertSame($expected_title, $stored_title);
174+
self::assertSame($rule_title, utf8_decode_ncr($stored_title));
161175
}
162176

163177
/**

0 commit comments

Comments
 (0)