I believe you are using less-well-supported Unicode values, which don't always have glyphs for all the code points.
Try using the following characters:
☐ (0x2610 in Unicode hexadecimal [HTML decimal: ☐]): an empty (unchecked) checkbox
☑ (0x2611 [HTML decimal: ☑]): the checked version of the previous checkbox
✓ (0x2713 [HTML decimal: ✓])
✔ (0x2714 [HTML decimal: ✔])
Note: There seems to be some confusion about the first symbol here, ☐ / 0x2610. This is an empty (unchecked) checkbox, so if you see a box, that's the way it's supposed to look. It's the counterpart to ☑ / 0x2611, which is then checked version.