$str is probably not really encoded as iso-8859-1. Those angled quote characters, and probably that weird hyphen character don’t existing in that character set.
For starters, if your goal is utf8, and you’re using a web browser and web page to view and test this, you need to set the proper http header so the browser understands the encoding.
header('content-type: text/plain;charset=utf-8');
Be aware that the encoding you set your text editor to plays a part here if you’re pasting string literals into the file. The editor might be doing some conversions. Some editors behave differently in how and when they convert, so I would try to avoid testing like this and just get the data from wherever it comes from, like the db.
Personally I usually look at the byte values in the string
print_r(array_map('ord', str_split($str)));
And then from there try to match it up with an encoding by looking at the byte values, and how many/which bytes are used to represent certain characters.
Already answered, Nonetheless if you know already what you want to see in place of these special chars, you may consider replacing these chars with your own text/words/no utf chars. And if you disagree, then you may try out the other angel of it, by trying to know the meaning of it through byte chars as said already.