Skip to content

Commit 92f9810

Browse files
authored
More locale cases (#1115)
1 parent d4c112e commit 92f9810

File tree

8 files changed

+213
-0
lines changed

8 files changed

+213
-0
lines changed

Dockerfile-msphpsql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ ENV PATH="/opt/mssql-tools/bin:${PATH}"
4242

4343
# add locales for testing
4444
RUN sed -i 's/# en_US ISO-8859-1/en_US ISO-8859-1/g' /etc/locale.gen
45+
RUN sed -i 's/# fr_FR@euro ISO-8859-15/fr_FR@euro ISO-8859-15/g' /etc/locale.gen
4546
RUN sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen
4647
RUN sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
4748
RUN locale-gen

azure-pipelines.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ jobs:
111111
112112
- script: |
113113
sudo sed -i 's/# en_US ISO-8859-1/en_US ISO-8859-1/g' /etc/locale.gen
114+
sudo sed -i 's/# fr_FR@euro ISO-8859-15/fr_FR@euro ISO-8859-15/g' /etc/locale.gen
114115
sudo sed -i 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen
115116
sudo sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen
116117
sudo locale-gen

source/shared/localization.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,7 @@ inline UINT SystemLocale::MaxCharCchSize( UINT codepage )
247247
switch ( codepage )
248248
{
249249
case CP_UTF8:
250+
case 54936:
250251
return 4;
251252
case 932:
252253
case 936:

source/shared/localizationimpl.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ const cp_iconv cp_iconv::g_cp_iconv[] = {
7777
{ 1256, "CP1256" TRANSLIT },
7878
{ 1257, "CP1257" TRANSLIT },
7979
{ 1258, "CP1258" TRANSLIT },
80+
{ 54936, "GB18030" TRANSLIT},
8081
{ CP_ISO8859_1, "ISO8859-1" TRANSLIT },
8182
{ CP_ISO8859_2, "ISO8859-2" TRANSLIT },
8283
{ CP_ISO8859_3, "ISO8859-3" TRANSLIT },
@@ -342,6 +343,11 @@ SystemLocale::SystemLocale( const char * localeName )
342343
const LocaleCP lcpTable[] = {
343344
{ "utf8", CP_UTF8 },
344345
{ "UTF-8", CP_UTF8 },
346+
{ "BIG5", 950 },
347+
{ "BIG5-HKSCS", 950 },
348+
{ "gb18030", 54936 },
349+
{ "gb2312", 936 },
350+
{ "gbk", 936 },
345351
CPxxx(1252), CPxxx(850), CPxxx(437), CPxxx(874), CPxxx(932), CPxxx(936), CPxxx(949), CPxxx(950),
346352
CPxxx(1250), CPxxx(1251), CPxxx(1253), CPxxx(1254), CPxxx(1255), CPxxx(1256), CPxxx(1257), CPxxx(1258),
347353
ISO8859(1), ISO8859(2), ISO8859(3), ISO8859(4), ISO8859(5), ISO8859(6),
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
--TEST--
2+
Test another ANSI encoding fr_FR euro locale outside Windows
3+
--DESCRIPTION--
4+
This file must be saved in ANSI encoding and the required locale must be present
5+
--ENV--
6+
PHPT_EXEC=true
7+
--SKIPIF--
8+
<?php require('skipif_unix_ansitests.inc'); ?>
9+
--FILE--
10+
<?php
11+
12+
function insertData($conn, $tableName, $inputs)
13+
{
14+
try {
15+
$tsql = "INSERT INTO $tableName (id, phrase) VALUES (?, ?)";
16+
$stmt = $conn->prepare($tsql);
17+
18+
for ($i = 0; $i < count($inputs); $i++) {
19+
$stmt->execute(array($i, $inputs[$i]));
20+
}
21+
} catch( PDOException $e ) {
22+
echo "Failed to insert data\n";
23+
print_r( $e->getMessage() );
24+
}
25+
}
26+
27+
function dropTable($conn, $tableName)
28+
{
29+
$tsql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'" . $tableName . "') AND type in (N'U')) DROP TABLE $tableName";
30+
$conn->exec($tsql);
31+
}
32+
33+
require_once('MsSetup.inc');
34+
35+
try {
36+
$locale = 'fr_FR@euro';
37+
setlocale(LC_ALL, $locale);
38+
39+
$conn = new PDO("sqlsrv:server = $server; database=$databaseName; driver=$driver", $uid, $pwd);
40+
$conn->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_SYSTEM);
41+
$tableName = "pdo_ansitest_FR";
42+
43+
dropTable($conn, $tableName);
44+
45+
$tsql = "CREATE TABLE $tableName([id] [int] NOT NULL, [phrase] [varchar](50) NULL)";
46+
$conn->exec($tsql);
47+
48+
$inputs = array("À tout à l'heure!",
49+
"Je suis désolé.",
50+
"À plus!",
51+
" Je dois aller à l'école.");
52+
53+
// Next, insert the strings
54+
insertData($conn, $tableName, $inputs);
55+
56+
// Next, fetch the strings
57+
$tsql = "SELECT phrase FROM $tableName ORDER by id";
58+
$stmt = $conn->query($tsql);
59+
60+
$results = $stmt->fetchAll(PDO::FETCH_NUM);
61+
for ($i = 0; $i < count($inputs); $i++) {
62+
if ($results[$i][0] !== $inputs[$i]) {
63+
echo "Unexpected phrase retrieved:\n";
64+
var_dump($results[$i][0]);
65+
}
66+
}
67+
68+
dropTable($conn, $tableName);
69+
70+
unset($stmt);
71+
unset($conn);
72+
} catch (PDOException $e) {
73+
print_r($e->getMessage());
74+
}
75+
76+
echo "Done" . PHP_EOL;
77+
?>
78+
--EXPECT--
79+
Done
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
4+
die("skip Test for Linux and macOS");
5+
}
6+
7+
if (!extension_loaded("pdo_sqlsrv")) {
8+
die("skip Extension not loaded");
9+
}
10+
11+
$loc = setlocale(LC_ALL, 'fr_FR@euro');
12+
if (empty($loc)) {
13+
die("skip required French locale not available");
14+
}
15+
16+
?>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
4+
die("skip: Test for Linux and macOS");
5+
}
6+
7+
if (!extension_loaded("sqlsrv")) {
8+
die("skip extension not loaded");
9+
}
10+
11+
$loc = setlocale(LC_ALL, 'fr_FR@euro');
12+
if (empty($loc)) {
13+
die("skip required French locale not available");
14+
}
15+
16+
?>
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
--TEST--
2+
Test another ansi encoding fr_FR euro locale outside Windows
3+
--DESCRIPTION--
4+
This file must be saved in ANSI encoding and the required locale must be present
5+
--ENV--
6+
PHPT_EXEC=true
7+
--SKIPIF--
8+
<?php require('skipif_unix_ansitests.inc'); ?>
9+
--FILE--
10+
<?php
11+
12+
function insertData($conn, $tableName, $inputs)
13+
{
14+
$tsql = "INSERT INTO $tableName (id, phrase) VALUES (?, ?)";
15+
16+
$param1 = null;
17+
$param2 = null;
18+
$params = array(&$param1, &$param2);
19+
20+
$stmt = sqlsrv_prepare($conn, $tsql, $params);
21+
if ($stmt === false) {
22+
echo "Failed to prepare the insert statement\n";
23+
die(print_r(sqlsrv_errors(), true));
24+
}
25+
26+
for ($i = 0; $i < count($inputs); $i++) {
27+
$param1 = $i;
28+
$param2 = $inputs[$i];
29+
if (!sqlsrv_execute($stmt)) {
30+
echo "Statement could not be executed.\n";
31+
die(print_r(sqlsrv_errors(), true));
32+
}
33+
}
34+
}
35+
36+
function dropTable($conn, $tableName)
37+
{
38+
$tsql = "IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'" . $tableName . "') AND type in (N'U')) DROP TABLE $tableName";
39+
sqlsrv_query($conn, $tsql);
40+
}
41+
42+
require_once('MsSetup.inc');
43+
44+
$tableName = "srv_ansitest_FR";
45+
$locale = 'fr_FR@euro';
46+
setlocale(LC_ALL, $locale);
47+
48+
$conn = sqlsrv_connect($server, $connectionOptions);
49+
if( $conn === false ) {
50+
echo "Failed to connect\n";
51+
die(print_r(sqlsrv_errors(), true));
52+
}
53+
54+
dropTable($conn, $tableName);
55+
56+
$tsql = "CREATE TABLE $tableName([id] [int] NOT NULL, [phrase] [varchar](50) NULL)";
57+
$stmt = sqlsrv_query($conn, $tsql);
58+
59+
$inputs = array("À tout à l'heure!",
60+
"Je suis désolé.",
61+
"À plus!",
62+
" Je dois aller à l'école.");
63+
64+
// Next, insert the strings
65+
insertData($conn, $tableName, $inputs);
66+
67+
// Next, fetch the strings
68+
$tsql = "SELECT phrase FROM $tableName ORDER by id";
69+
$stmt = sqlsrv_query($conn, $tsql);
70+
if ($stmt === false) {
71+
echo "Failed to run select query\n";
72+
die(print_r(sqlsrv_errors(), true));
73+
}
74+
75+
$i = 0;
76+
while (sqlsrv_fetch($stmt)) {
77+
$phrase = sqlsrv_get_field($stmt, 0);
78+
if ($phrase != $inputs[$i++]) {
79+
echo "Unexpected phrase retrieved:\n";
80+
var_dump($phrase);
81+
}
82+
}
83+
84+
dropTable($conn, $tableName);
85+
86+
sqlsrv_free_stmt($stmt);
87+
sqlsrv_close($conn);
88+
89+
echo "Done" . PHP_EOL;
90+
?>
91+
--EXPECT--
92+
Done
93+

0 commit comments

Comments
 (0)