使用从 mysqli php 到 MySql 数据库的 http 请求在 Ionic2 TypeScript 应用程序中检索希伯来语

Retrieve Hebrew in Ionic2 TypeScript application with http request from from mysqli php to MySql database

我正在尝试弄清楚如何获得 Hebrew 个字符。在我的 connection.php 中,我有 $con->set_charset('utf8');,因此字母出现在输入字段中并使用此 connection.php:

正确记录在 MySql 数据库中
<?php
header("Access-Control-Allow-Origin: *");
header('Content-type: text/xhtml; charset=windows-1255');

$con = new mysqli('localhost:XXXX', 'user', 'password');
$con->set_charset('utf8');

if (!$con)
{
    echo 'Not Connected To Server';
}

if (!mysqli_select_db ($con, 'mydb'))
{
    echo 'Database Not Selected';
}
?>

但在几个地方,当我试图从列表中获取它时,例如下面的 home.ts this.function(); http 请求,它看起来是这样的:

 function() {
    var headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    let options = new RequestOptions({ headers: headers });
      let postParams = '&user=' + this.user;
      this.http.post(this.phpPath + "select.php", (postParams), options)
        .subscribe(data => {         
          var nmb = (data.text().split(".").length);
          let x = data.text().split(".");
          for (var i = 0; i < nmb; i++) {
            var c = x[i];          
              this.list.push({ id: i, name: this.s + c }, );
          }
        }, error => {
          console.log(error);
        });     
  }

特别select.php 使用connection.php:

<?php
require 'connection.php';
$user = mysqli_real_escape_string($con, $_POST["user"]);
$sql = "SELECT name FROM tab where user='".$user."'";
$result = mysqli_query($con, $sql);
if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        echo $row["name"].'.';
    }
} else {
    echo "0 results";
}
mysqli_close($con);
?>

我尝试将 <meta charset="UTF-8"> 添加到 home.html,但 index.html 已经包含它。而且我还尝试用 UTF-8 编码的记事本保存 home.html,但没有任何帮助。

header(‘Content-type: text/xhtml; charset=windows-1255’); 已经在 connection.php 中,结果我在 MySql 数据库记录中有来自其他 http 请求和 .php 后端的希伯来字符.

例如在应用程序中输入:

或 MySql table:

但这不会影响按钮,以及同一应用程序 UI 中具有相同 connection.php 的其他几个地方,例如来自特定代码的这个:

如果没有 header(‘Content-type: text/xhtml; charset=windows-1255’); 它看起来像这样:

或申请中:

但不同于:

我不太明白,我做错了什么,必须用XHTML改变,发送UTF-8并承诺windows-1255,但我已经尝试了return 它不同,作为 select.phpjson 和数组 $myArray[] = $row; 作为 http 请求中的 let obj: MyObj = JSON.parse(data.text());

在结果控制台中:

\u05d0\u05d1\u05d2\u05d3

objectundefined

我发现了这个 Whosebug answer,它说旧式 ASCII 属性 列表只允许 ASCII 个字符,并且我有一个字符串的打印描述。也许这是一个原因,但我不确定,如何在 Ionic2 TypeScript

编辑 1:

我用 $con->set_charset('utf8mb4'); 而不是 utf8 编辑了 connection.php,而且我还使用了 $con->query("SET collation_connection = utf8mb4_unicode_520_ci");:

$con = new mysqli('host', 'user', 'password');
$con->set_charset('utf8mb4');
$con->query("SET collation_connection = utf8mb4_unicode_520_ci");

MySql 服务器上的数据库行是utf8_general_mysql500_ci,其中包含希伯来字符记录并在其他应用程序中通过请求检索。

我不确定,如何为 Ionic2 html 页面设置 <meta charset=UTF-8>,它已经在项目 index.html<head> 中。添加到 home.html 或任何其他页面 <ion-header>,没有任何变化。

\u05d0\u05d1\u05d2\u05d3 的情况下 echo json_encode($myArray, JSON_UNESCAPED_UNICODE); 看起来像 returns 正确的英文字符串 json 名称,但希伯来语仍在 Mojibake 中。无论如何,为了避免 Unicode codepoints,在我的例子中,在 http 请求中得到没有数组和对象的回显 $row["name"].'.'; 就足够了。但我不确定,如何处理 Mojibake

编辑 2:

显示创建 table,name 列包含希伯来语:

CREATE TABLE `band` (
 `ID` int(20) NOT NULL AUTO_INCREMENT,
 `name` varchar(300) COLLATE utf8_general_mysql500_ci NOT NULL,
 `style` varchar(100) COLLATE utf8_general_mysql500_ci NOT NULL,
 `member` text COLLATE utf8_general_mysql500_ci NOT NULL,
 `zone` varchar(300) COLLATE utf8_general_mysql500_ci NOT NULL,
 `region` varchar(100) COLLATE utf8_general_mysql500_ci NOT NULL,
 `website` varchar(800) COLLATE utf8_general_mysql500_ci NOT NULL,
 `image` varchar(2083) COLLATE utf8_general_mysql500_ci NOT NULL,
 `user` varchar(700) COLLATE utf8_general_mysql500_ci NOT NULL,
 `num` varchar(200) COLLATE utf8_general_mysql500_ci NOT NULL,
 `registration` varchar(300) COLLATE utf8_general_mysql500_ci NOT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COLLATE=utf8_general_mysql500_ci

编辑 3:

<?php
require 'connection.php';   
$user = mysqli_real_escape_string($con, $_POST["user"]);  
$sql = "SELECT name, HEX(name) AS hex_name FROM tab where user='".$user."'";  
$result = mysqli_query($con, $sql);
if (mysqli_num_rows($result) > 0) {
    while($row = mysqli_fetch_assoc($result)) {
        echo $row["name"], ' ', $row["hex_name"], '.';
    }
} else {
    echo "0 results";
}    
mysqli_close($con);
?>

结果:

编辑 4:

文本结果:

正文:

 ׳׳‘׳’׳“

׳׳•׳¨ ׳¢׳§׳™׳‘׳

׳׳׳•׳ ׳™ ׳™׳¦׳—׳§

从控制台复制:

在数据库中:

作为希伯来语文本:

אבגד
אור עקיבא
אלוני יצחק

同时与其他页面中的另一个请求相同table并记录,控制台:

在应用程序中:

我至少看到 3 个问题。

\u05d0\u05d1\u05d2\u05d3 -- 正在使用 Unicode 代码点。不要那样做。使用json_encode(str, JSON_UNESCAPED_UNICODE)来避免它。

一图显示"Mojibake";另一个显示 "black diamonds"。两者都被讨论 set_charset('utf8') 只是需要保持一致的大约 4 件事之一。

重新编辑 3: D790 D791 D792 D793אבגד 的 utf8 编码的正确十六进制。因此,数据存储正确。但是数据显示不正确(Mojibake)。现在,通过 link:

  • 要存储的字节需要进行 UTF-8 编码。 -- 这个可以。
  • INSERTing和SELECTing text时的连接需要指定utf8或utf8mb4。 -- 提供 SHOW VARIABLES LIKE 'char%'
  • 该列需要声明为 CHARACTER SET utf8(或 utf8mb4)。 -- 这个可以。
  • HTML 应该以 <meta charset=UTF-8> 开头。 -- 如果您在网页上显示,请在 HTML 中或通过配置浏览器查看它是否设置为该方式。

但是...我对我们尚未达成一致感到不满意。 Mojibake 应显示 ×בגד。您可以复制并粘贴输出吗?我无法对那张图片做任何事情。