For aesthetic reasons, I’d like to replace -> in my program with actual arrow characters (→). It works perfectly everywhere, except in ListView items, where the arrow is replaced by an empty square.
Any ideas why?
Code (VB.Net, targeting framework 2.0):
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Dim ListView1 As New System.Windows.Forms.ListView()
Dim ColumnHeader1 As New System.Windows.Forms.ColumnHeader()
Dim ColumnHeader2 As New System.Windows.Forms.ColumnHeader()
Dim ListViewItem1 As System.Windows.Forms.ListViewItem = New System.Windows.Forms.ListViewItem(New String() {"Arrow", "A → B"})
ListView1.Columns.AddRange(New System.Windows.Forms.ColumnHeader() {ColumnHeader1, ColumnHeader2})
ListView1.Items.AddRange(New System.Windows.Forms.ListViewItem() {ListViewItem1})
ListView1.Location = New System.Drawing.Point(12, 12)
ListView1.Size = New System.Drawing.Size(205, 150)
ListView1.View = System.Windows.Forms.View.Details
Me.Controls.Add(ListView1)
End Sub
End Class
Output:

No repro, obviously. Working with utf-8 in the context of ListView otherwise makes no sense. .NET strings are stored internally in utf-16.
After question update: a rectangle appears when the font doesn’t have the glyph to display the codepoint. Troubleshoot with the charmap.exe applet. And do make sure that you are actually reading the file correctly. Use the debugger to inspect the string. Use the string’s ToCharArray() method to look at the individual character codes.