0

我正在用葡萄和安卓客户端构建 API 服务器。

当我为上传内容和图像制作发布 API 时,遇到编码问题。

我使用“utf-8”编码将消息和图像发送到服务器,但服务器使用“ascii-8bit”编码识别消息。

我使用后面的代码测试了字符串信息。

puts "DEBUG ---- content : #{params[:content].unpack("H*")}"
  puts "DEBUG ---- content : #{params[:content].encoding}"
  puts "DEBUG ---- content2 : #{"테스트테스트".unpack("H*")}"
  puts "DEBUG ---- content2 : #{"테스트테스트".encoding}"

结果是

DEBUG ---- content : ["ed858cec8aa4ed8ab8ed858cec8aa4ed8ab8"]
DEBUG ---- content : ASCII-8BIT
DEBUG ---- content2 : ["ed858cec8aa4ed8ab8ed858cec8aa4ed8ab8"]
DEBUG ---- content2 : UTF-8

所以这两个字符串具有相同的数据,但在服务器上无法理解。

感谢您的意见。

太浩。

4

1 回答 1

1

可能发生这种情况是因为您的 Android 客户端未在其请求中为每个表单字段指定字符编码,这导致 Rack 将数据作为原始二进制文件(即“ASCII-8BIT”)传递给 Grape。

您的 Android 应用程序应为其提交的每个表单数据部分指定字符编码,例如

Content-Disposition: form-data; name="content"
Content-Type: text/plain; charset=UTF-8

这将如何完成取决于您在应用程序中使用什么方法来构建请求。

如果您总是期望来自客户端的 UTF-8 数据,您可以(并且可能应该)将其设置为服务器上 Ruby 中字符串的默认字符编码。这应该由 Rails 自动为您完成;你可以尝试明确设置

config.encoding = Encoding::UTF_8

但请注意,config/application.rb这已经是默认设置。

如果一切都失败了,您可能需要在操作之前明确设置您收到的每个字符串的编码。试试这个:

utf_content = params[:content].force_encoding("UTF-8")
puts "DEBUG ---- content : #{utf_content.unpack("H*")}"
puts "DEBUG ---- content : #{utf_content.encoding}"
于 2014-07-22T18:17:26.337 回答