无法将索引35处的字节[FC]从指定代码页转换为Unicode

时间:2016-08-22 09:41:45

标签: asp.net .net unicode asp.net-core asp.net-core-mvc

我试图将这样的对象发送到我的REST API(使用asp net core构建)

{
    "firstName":"tersü",
    "lastName":"asda"
}

这就是SoapUI的标题形式:

 Accept-Encoding: gzip,deflate
Content-Type: application/json:charset=UTF-16
Host: localhost:4004
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

但是,我的actionContext.ModelState始终无效,因为它无法与变音符号一起使用。例外情况如下:

  

无法将索引35处的字节[FC]从指定的代码页转换为   Unicode的

如果有任何帮助,方法签名如下所示:

[ValidateUserData]
public async Task<IActionResult> Update(string userId, [FromBody] UpdateUserRequest updateRequest)

基本上代码永远不会过去

if (!actionContext.ModelState.IsValid)
{
    actionContext.Result = new BadRequestObjectResult(actionContext.ModelState);
}

[ValidateUserData]属性

我在这里缺少什么?

4 个答案:

答案 0 :(得分:9)

您发送的代码是utf-16编码的字符串,但是告诉(Content-Type标题字符集中)utf-8

tersüutf-8的字节数为:

74,65,72,73,C3,BC

但是tersü(在utf-16中)包含字节(注意那里的FC):

74,0,65,0,72,0,73,0,FC,0

(检查in this fiddle

所以它无法理解它。因此,要么在发送之前将字符串转换为客户端中的utf-8,要么将Content-Type字符集设置为utf-16

答案 1 :(得分:2)

虽然Content-Type是charset UTF-8,但是接收到的字节代码FC表示扩展的ASCII字符252,它表示变音符号“ü”。

在UTF-8编码中,变音符号“ü”由两个字节组成。因此,给定的编码头与传输的数据之间存在不匹配。因此,您必须检查生成请求的代码。

答案 2 :(得分:0)

不是所提出问题的直接解决方案,而是相关问题的解决方案:

将Winforms应用程序从Net.4.0降级到Net.2.0时出现此错误消息(由于第三方表单控制问题)

在表单设计器中指定的每个ImageList对象实例都会受到影响。

我从RESX文件和Designer代码中剪切了所有此类实例,使其成为私有对象,并在Form_Load事件中进行了所需的初始化。

此后在Net.2.0或Net 4.0配置中没有问题。

答案 3 :(得分:-1)

在.rdl文件上使用SSRS时出现此错误。解决方案是我需要将文件另存为未签名的UTF-8文件,而不是已签名的UTF-8文件。这是在Visual Studio中执行的操作:

  1. 通过转到“视图”->“代码”或按F7键来打开XML代码
  2. 在查看XML代码页时,选择文件->高级保存选项
  3. 在出现的弹出窗口中,选择“ Unicode(不带签名的UTF-8)...”
  4. 单击确定

为我解决了这个问题,希望对您有所帮助!