www.text возвращает странное значение в Unity3D (C#)

Я использую WWW Unity 3D для выполнения http-запросов: http://docs.unity3d.com/ScriptReference/WWW.html

Кажется, что независимо от того, к каким данным я пытаюсь получить доступ, он просто возвращает: ���� каждый раз. Я пробовал файлы json, пробовал php, который просто генерирует строку. Я не могу получить доступ к значениям на сервере.

C#:

public string url = "http://www.onelittledesigner.com/data.php";

IEnumerator Start() {
    WWW www = new WWW(url);
    yield return www;

    if (!string.IsNullOrEmpty(www.error)) {
        Debug.Log(www.error);
    } else {
        Debug.Log(www.text);
    }

}

PHP:

<?php
  echo "textiness";
?>

Примечание. Я успешно использовал www.texture для загрузки изображений с сервера. Однако www.text, похоже, не работает.


person heckascript    schedule 19.07.2014    source источник
comment
Я не использую C#, но не следует ли сначала преобразовать www.error и www.text в строки? Мне кажется, что функция Debug.Log принимает вашу переменную, но ваша переменная имеет неправильный формат.   -  person AStopher    schedule 19.07.2014
comment
Это строки уже по умолчанию, я проверил.   -  person heckascript    schedule 19.07.2014
comment
попробуйте: Debug.Log(текст: + www.text); или Debug.Log(www.text.ToString()); для принудительного преобразования строки   -  person LearnCocos2D    schedule 19.07.2014
comment
@LearnCocos2D Вот результат, который я получаю -› текст: ����   -  person heckascript    schedule 19.07.2014
comment
@hellaFont Существует ли string().c_str() в C#? Если это так, попробуйте использовать это. Это долгий путь, но он может привести к ожидаемому результату.   -  person AStopher    schedule 19.07.2014
comment
@hellaFont Просто пришла идея. Перейдите к определению переменной и вставьте его сюда/проверьте, что это действительно строка.   -  person AStopher    schedule 19.07.2014
comment
@zyboxinternational Нет string().c_str() :/ но это была действительно хорошая идея.   -  person heckascript    schedule 19.07.2014
comment
Ага, кажется, я вижу несколько возможных решений: docs.unity3d.com/ScriptReference/WWW -text.html   -  person heckascript    schedule 19.07.2014
comment
Я пробовал System.Text.Encoding.Default.GetString(www.bytes) со всеми разными кодировками (UTF8, ASCII, UTF7, UTF32, UNICODE). Ничего... Я не получил таких же результатов, но это были неправильные результаты.   -  person heckascript    schedule 19.07.2014
comment
@hellaFont Может быть, это вам пригодится? docs.unity3d.com/ScriptReference/WWW-bytes.html   -  person AStopher    schedule 19.07.2014
comment
Давайте продолжим это обсуждение в чате.   -  person heckascript    schedule 19.07.2014
comment
Нет воспроизведения. Работает просто отлично. Так что что-то еще должно идти не так, если это все еще не работает для вас.   -  person Bart    schedule 20.07.2014
comment
@ Барт, может быть, это как-то связано с сетью, в которой я нахожусь?   -  person heckascript    schedule 20.07.2014
comment
Если вы сбросите эту ссылку в свой браузер, что вы получите?   -  person Bart    schedule 20.07.2014
comment
Я получаю textiness, как и ожидалось. Возможно, это версия Unity, на которой я работаю? 4.3.1 Про.   -  person heckascript    schedule 20.07.2014
comment
Хм, у меня тут 4.5.2. Может попробовать обновить? Между этими версиями было внесено множество исправлений в WWW.   -  person Bart    schedule 20.07.2014
comment
@hellaFont Вы пробовали код из вопроса в новом проекте? Вы тестируете один и тот же код или только что-то похожее в своем более крупном проекте?   -  person Stefan Hoffmann    schedule 20.07.2014
comment
@Leosori, это отличная идея, я попробую в пустом проекте и опубликую результаты позже.   -  person heckascript    schedule 21.07.2014
comment
Попробуйте опубликовать результат string s=""; foreach(var b in www.bytes) s+=(b+" "); Debug.Log(s);.   -  person Krzysztof Bociurko    schedule 22.07.2014
comment
116 101 120 116 105 110 101 115 115 === textiness, это полностью сработало! спасибо @ChanibaL! поместите это в ответ, и я приму его :)   -  person heckascript    schedule 22.07.2014


Ответы (2)


Копирование ответа из комментария с некоторыми дополнительными тестами. Мои результаты в комментариях. Обратите внимание, что использование Default, ASCII или UTF8 работает на моей машине — так же должно быть и на вашей.

    // returned from www.bytes, copied here for readability
    byte[] bytes=new byte[]{116, 101, 120, 116, 105, 110, 101, 115, 115};

    string customDecoded=""; 
    foreach(var b in bytes)
        customDecoded+=(char)b; 

    Debug.Log(customDecoded); // textiness
    Debug.Log(System.Text.Encoding.Default); // System.Text.ASCIIEncoding
    Debug.Log(System.Text.Encoding.Default.GetString(bytes));  // textiness
    Debug.Log(System.Text.Encoding.ASCII.GetString(bytes));  // textiness
    Debug.Log(System.Text.Encoding.Unicode.GetString(bytes)); // 整瑸湩獥
    Debug.Log(System.Text.Encoding.UTF7.GetString(bytes)); // textiness
    Debug.Log(System.Text.Encoding.UTF8.GetString(bytes)); // textiness
    Debug.Log(System.Text.Encoding.UTF32.GetString(bytes)); // 整湩
    Debug.Log(System.Text.Encoding.BigEndianUnicode.GetString(bytes)); // 瑥硴楮敳

Пожалуйста, проверьте, является ли System.Text.Encoding.Default ASCIIEncoding, возможно, что-то изменило значение по умолчанию?

person Krzysztof Bociurko    schedule 25.07.2014

Мой ответ предполагает, что этот скрипт прикреплен к MonoBehaviour. Причина, по которой он не работает, заключается в том, что вы пытались превратить метод Start в сопрограмму, но сделали это только наполовину.

Вот что вам нужно сделать

private void Start()
{
   StartCoroutine(StartCR());
}

IEnumerator StartCR() 
{
   WWW www = new WWW(url);
   yield return www;

   if (!string.IsNullOrEmpty(www.error)) {
    Debug.Log(www.error);
   } else {
    Debug.Log(www.text);
   }
}

Unity вызовет метод Start, который, в свою очередь, правильно вызовет ваш программный WWW-код. Это будет ждать завершения вашего веб-ответа, а не просто ничего не возвращать.

person Alex    schedule 24.07.2014
comment
Ответ недействителен — сопрограмма запускается Unity, если метод Start равен IEnumerator Start(). См. второй пример на странице docs.unity3d.com/ScriptReference/. - person Krzysztof Bociurko; 25.07.2014
comment
Мой плохой не понимает, что вы использовали js. Тем не менее ответ действителен в С# :) - person Alex; 25.07.2014
comment
Код HellaFont четко обозначен как C#, а IEnumerator Start() — это конструкция C# (unityscript угадывает возвращаемый тип). Здесь нет js/unityscript. - person Krzysztof Bociurko; 25.07.2014
comment
Никогда не видел, чтобы это так работало. Но почти уверен, что это будет работать таким образом. - person Alex; 25.07.2014
comment
Чтобы уточнить: да, ваш код действителен, но он не устраняет ни одну из проблем OP, поэтому это неправильный ответ. - person Krzysztof Bociurko; 25.07.2014