##### SUMMARY
Wide glyphs in task names cause the asterisks in the output to wrap around to the next line. My guess is that Ansible is treating characters that take up two spaces as one. Example: 🚀 and 汉字.

##### ISSUE TYPE
- Bug Report

##### COMPONENT NAME
ansible

##### ANSIBLE VERSION
```
ansible 2.8.5
  config file = /home/major/git/cki-project-experimental/aws-deployment/ansible.cfg
  configured module search path = ['/home/major/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/major/.pyenv/versions/3.7.4/envs/venv-3.7.4/lib/python3.7/site-packages/ansible
  executable location = /home/major/.pyenv/versions/venv-3.7.4/bin/ansible
  python version = 3.7.4 (default, Sep 20 2019, 07:35:42) [GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
```

##### CONFIGURATION
```
(no config changes from defaults)
```

##### OS / ENVIRONMENT
Fedora 30 with Python 3.7.4

##### STEPS TO REPRODUCE
I ran a playbook that contains emojis:

```yaml
---

- hosts: localhost
  gather_facts: no

  tasks:

    - name: "🚀 This name has emoji"
      debug:
        msg: "🚀 is a fun emoji"

    - name: "汉字 This name has Chinese characters"
      debug:
        msg: "汉字 means 'Chinese character'"
```

##### EXPECTED RESULTS

I expected the asterisks to be the same length for all lines without wrapping.


##### ACTUAL RESULTS
The output is:

```
PLAY [deployer] *****************************************************************************

TASK [🚀 This name has emoji] ****************************************************************
Thursday 03 October 2019  11:03:41 -0500 (0:00:00.025)       0:00:00.025 ****** 
ok: [localhost] => 
  msg: 🚀 is a fun emoji

TASK [汉字 This name has Chinese characters] **************************************************
Thursday 03 October 2019  11:03:41 -0500 (0:00:00.009)       0:00:00.035 ****** 
ok: [localhost] => 
  msg: 汉字 means 'Chinese character'

PLAY RECAP **********************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  
```
if not formatted:
            new_msg = "[WARNING]: %s" % msg
            wrapped = textwrap.wrap(new_msg, self.columns)
            new_msg = "\n".join(wrapped) + "\n"
        else:
            new_msg = "\n[WARNING]: \n%s" % msg
        if new_msg not in self._warns:
            self.display(new_msg, color=C.COLOR_WARN, stderr=True)
            self._warns[new_msg] = 1
    def system_warning(self, msg):
        if C.SYSTEM_WARNINGS:
            self.warning(msg)
    def banner(self, msg, color=None, cows=True):
        '''
        Prints a header-looking line with cowsay or stars with length depending on terminal width (3 minimum)
        '''
        if self.b_cowsay and cows:
            try:
                self.banner_cowsay(msg)
                return
            except OSError:
                self.warning("somebody cleverly deleted cowsay or something during the PB run.  heh.")
        msg = msg.strip()
        star_len = self.columns - len(msg)
        if star_len <= 3:
            star_len = 3
        stars = u"*" * star_len
        self.display(u"\n%s %s" % (msg, stars), color=color)
    def banner_cowsay(self, msg, color=None):