从iOS到PHP的特殊字符和表情符号



我看了很多线程,但我没有找到正确的解决方案,或者它不起作用......这让我很生气^^。

我尝试了很多东西,但没有一个正常工作。

我的问题很容易..我认为;)

我想从我的iPhone发送文本到php脚本,然后将其保存在SQL数据库中。

首先,特殊字符不起作用。A " 将是 "\quot;(不带 \ :O )等等。接下来,从iPhone到php的表情符号更改为例如ðŸ ̃。

这是我的iPhone代码,用于向php发送文本:

NSString *post = [[NSString alloc] initWithFormat:@"&action=messageAdd&text=%@"textField.text];
    NSData * postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:NO];
    NSString * postLength = [NSString stringWithFormat:@"%d",[postData length]];
    NSMutableURLRequest * request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://xxxx.com/xx.php"]]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

这里是来自 PHP 文件的代码

header('Content-Type: text/html; charset=utf-8');
..
..
..
$text = htmlentities(trim(stripinput($_POST['text'])));

这让我对所有不同的变体感到困惑。我希望有人能引导我朝着正确的方向前进。代码总是受欢迎的:)

当您将带有表情符号的数据字符串发送到您的 PHP 页面时,您必须使用此编码:

NSData *data = [string dataUsingEncoding:NSNonLossyASCIIStringEncoding];

如果您必须发送此数据的字符串,则可以使用以下方法将其转换为字符串:

NSString str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

所以,你会有一个像 \ucode 而不是微笑的字符串。

当您从数据库接收到应用程序的字符串时,您可以执行以下操作:

NSString str = [[NSString alloc] initWithData:data encoding:NSNonLossyASCIIStringEncoding];

名声大作;)

关于表情符号:

表情符号的问题可能来自编码差异(即您的 php 页面显示的文本编码与 iPhone 发送文本时使用的文本编码不同)。

关于报价:

当你调用htmlentities()时,你专门将具有html等价的字符转换为该html等价字符。这意味着"将被转换为 " .

您可以使用 ENT_NOQUOTES 标志使此函数保持单引号和双引号未转换:

$text = htmlentities(trim(stripinput($_POST['text'])), ENT_NOQUOTES);

请注意,如果引号会影响您在其他地方对文本执行的操作,则这可能是危险的。如果引号改变了 html 的适用方式,则输出到页面的字符串可能会奇怪地呈现,如果您没有正确考虑数据库相关代码中的引号,数据库交互可能会受到影响。

我有一个类似的问题,我通过使用以下方法存储文本的 base64 编码字符串来解决 MSSQL 存储部分而不更改数据库:

+(NSString*) base64EncodeString:(NSString*)string {
    return [@"b64:" stringByAppendingString:[[string dataUsingEncoding:NSUTF32BigEndianStringEncoding] base64EncodedStringWithOptions:0]];
}
+(NSString*) base64DecodeString:(NSString*)string {
    if ([string hasPrefix:@"b64:"]) {
        string = [string substringFromIndex:4];
        string = [[NSString alloc] initWithData:[[NSData alloc] initWithBase64EncodedString:string options:0] encoding:NSUTF32BigEndianStringEncoding];
    }
    return string;
}

请注意,我在字符串前面加上了 b64:,所以我的代码仍然可以处理非编码文本。

它按照我想要的方式工作,我现在可以将表情符号和多字节字符保存在我的 MS-SQL 服务器上,并从我的 IOS 设备中检索它们,而无需担心我的数据库排序规则。

这也解决了单引号问题。

但!我也遇到了和你一样的问题。我想让我的PHP网站显示表情符号和MB字符。

我终于解决了这个问题!但是现在有一个新的问题。

我将数据库更改为 utf8MB4,并在连接到我调用的数据库后

mysql_query("SET NAMES 'utf8mb4'");

在数据库中,表情符号显示为

但在iOS设备上,它显示为表情符号。

现在的问题是,如何将"?"从MySQL数据库显示到我的网站?

最新更新